c 2d array a free

Sekcia o programovaní, programovacích jazykoch...
Používateľov profilový obrázok
marko365
Nový používateľ
Nový používateľ
Príspevky: 90
Dátum registrácie: So 03. Júl, 2010, 19:45
Bydlisko: Presov

c 2d array a free

Príspevok od používateľa marko365 »

Ako porovnam 2d polia bez toho aby kontroloval kazdy jeden znak v poliach mam na mysli z by skontroloval iba jedno pole nieco take :

char a[100][100];
char b[100][100];
for (i=0;i<=10;i++) {
if (a==b) } // to 2. nemusi
//...
totiz polia mam vynulovane a stale to roby ako keby neboli rovnake pricom su.
A este jedna otazka ako pouzijem "free" v 2d poliach hlasi mi to chybu :
for (x = 0; x < 100; x++)
for (y = 0; y < 100; y++) {
a[x][y]=(char) calloc (0,sizeof(char));
b[x][y]=(char) calloc (0,sizeof(char));
c[x][y]=(char) calloc (0,sizeof(char));
d[x][y]=(char) calloc (0,sizeof(char));



}
//...
for (i = 0; i < 100; i++) {


free(a);

free(b);

free(c);

free(d);

}
Používateľov profilový obrázok
pEpinko
Používateľ
Používateľ
Príspevky: 850
Dátum registrácie: Po 19. Máj, 2008, 09:31
Bydlisko: BA/NR

Re: c 2d array a free

Príspevok od používateľa pEpinko »

Ach jaj, no takze takto. Porovnanie a==b porovnava adresy, ktore su vzdy rozne. Ked chces porovnanie po prvkoch, tak to musis porovnat po prvkoch (pripadne, pouzit funkciu ako memcmp). A ten druhy tvoj problem

a[x][y]=(char) calloc (0,sizeof(char)); <- toto je uplne cele zle.
Spravne by si to mal spravit

a[x]=(char*) calloc (0,sizeof(char)*size); kde size je pocet znakov, ktore chces alokovat.

Nicmenej ak mas a definovane takto char a[100][100]; tak ich ani nealokuj ani nefreeuj. Vytvorene uz su rovnako ako sa sami dealokuju.
Používateľov profilový obrázok
marko365
Nový používateľ
Nový používateľ
Príspevky: 90
Dátum registrácie: So 03. Júl, 2010, 19:45
Bydlisko: Presov

Re: c 2d array a free

Príspevok od používateľa marko365 »

Vdaka o tom memcmp som nevedel a este co sa pise namiesto otaznikov.
n=memcmp (a,b,???????);
Používateľov profilový obrázok
pEpinko
Používateľ
Používateľ
Príspevky: 850
Dátum registrácie: Po 19. Máj, 2008, 09:31
Bydlisko: BA/NR

Re: c 2d array a free

Príspevok od používateľa pEpinko »

No memcmp funguje tak, ze mu das jeden usek pamate, druhy usek pamate a velkost (to su tvoje otazniky). Preto ked chces porovnať tie polia a a b, tak das podmienku

if (memcmp(a, b, 100*sizeof(char)) == 0)
{
//tu ide kod, ked su polia a a b rovnake
}
Používateľov profilový obrázok
marko365
Nový používateľ
Nový používateľ
Príspevky: 90
Dátum registrácie: So 03. Júl, 2010, 19:45
Bydlisko: Presov

Re: c 2d array a free

Príspevok od používateľa marko365 »

A este mam otazku: memcpy (1.blok pamate, 2.blok pamate, a tu ide co kam to ulozit )?
A ak chem ib jeden blok ulozit tak nieco tak: memcpy (1.blok, kam to presunut ) ?
Používateľov profilový obrázok
pEpinko
Používateľ
Používateľ
Príspevky: 850
Dátum registrácie: Po 19. Máj, 2008, 09:31
Bydlisko: BA/NR

Re: c 2d array a free

Príspevok od používateľa pEpinko »

memcpy pracuje podobne ako memcmp. Das mu dve adresy do pamate a velkost.

memcpy(a, b, n) sposobi, ze sa zoberie n bajtov so zaciatkom na adrese a a presunie sa na n bajtov so zaciatkom na adrese b.
Používateľov profilový obrázok
marko365
Nový používateľ
Nový používateľ
Príspevky: 90
Dátum registrácie: So 03. Júl, 2010, 19:45
Bydlisko: Presov

Re: c 2d array a free

Príspevok od používateľa marko365 »

Kód: Vybrať všetko

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int n;
	int m;
	int i;
	char **t;

	scanf ("%d",&n);
	scanf ("%d",&m);

	 for (i = 0; i < n; i++) {
	t[i]= (char*) calloc (0,sizeof(char)*m);
	 }

	free (t);
	return 0;
}
Este mam otazku k tomu calloc nechce mi vytvorit to 2d ploe co je tam zle ?
Používateľov profilový obrázok
pEpinko
Používateľ
Používateľ
Príspevky: 850
Dátum registrácie: Po 19. Máj, 2008, 09:31
Bydlisko: BA/NR

Re: c 2d array a free

Príspevok od používateľa pEpinko »

Samozrejme, ze ti ho nechce vytvorit, lebo t nie je inicialiyovane. Najprv musis dat (pred cyklus) t = (char**) malloc(n * sizeof(char*)).
Používateľov profilový obrázok
marko365
Nový používateľ
Nový používateľ
Príspevky: 90
Dátum registrácie: So 03. Júl, 2010, 19:45
Bydlisko: Presov

Re: c 2d array a free

Príspevok od používateľa marko365 »

Este stale je tam nieco zle lebo t = NULL. Skusal som to vseliak popisat a stale nic .
Používateľov profilový obrázok
pEpinko
Používateľ
Používateľ
Príspevky: 850
Dátum registrácie: Po 19. Máj, 2008, 09:31
Bydlisko: BA/NR

Re: c 2d array a free

Príspevok od používateľa pEpinko »

Hej, uz som si to vsimol, calloc pouzivas zle. Spravne to ma byt t= (char*) calloc (m, sizeof(char));. Cize cele to moze vyzerat takto:

Kód: Vybrať všetko

#include <stdio.h>
#include <stdlib.h>
int main()
{
   int n;
   int m;
   int i;
   char **t;

   scanf ("%d",&n);
   scanf ("%d",&m);

    t = (char**)malloc(n * sizeof(char*));
    for (i = 0; i < n; i++) {
        t[i]= (char*) calloc (m, sizeof(char));
    }

   free (t);
   return 0;
}
Inak nefreeujes dobre, freeovat musis vsetko co si naalokoval, teda jednotlive t a az potom samotne t.

Návrat na "Programovanie"