[ TomaROGM @ 07.02.2009. 21:48 ] @
Treba mi pomoc oko dinamicke alokacije matrice.Matrica je tipa char, u stvari niz stringova. Pokusavao sam da da koristim "realloc" ali nikako da proradi. Konacno sam nesto uradio sa "malloc", ali ima cudan problem. Kad god se odradi alociranje sa malloc, poremeti se prvi string, tj. prvi red u matrici. Evo kod:
Code:

#define korak 5
int main ()
{
    char **note = NULL;
    int duzina = 0, alocirano = 0, i;
    char *c;
    note = malloc(korak *sizeof(char*));
    do {
        if (duzina == alocirano) {
            for (i=alocirano; i<alocirano + korak; i++)
                note[i] = malloc(20 *sizeof(char));
            alocirano+=korak;
        }
        c = (char*)malloc(50 * sizeof(char));
        gets(c);
        if (strlen(c) == 0) break;
        strcpy (note[duzina++] , c);
        free (c);
    }while (1);
    for (i=0; i<duzina; i++){
        puts (note[i]);
        free (note[i]);
    }
    free (note);
    return 0;
}

Ako neko zna u cemu je problem ili neko drugo resenje za alociranje matrice kojoj je nepoznata duzina (a da je tipa char) bio bih zahvalan na pomoci.

EDIT: X Files : Molim Vas da zbog preglednosti i potencijalnog razlikovanja ITALIC od "indeks od i", kod upisujete između tag-ova predviđenih za to:

[code] /* ... */ [/code]
[ Aleksandar Ilić @ 08.02.2009. 17:25 ] @
Funkcija malloc vraća pokazivač na void i on treba da se kastuje u željeni. Četvrti red u main funkciji ne valja, treba ovo:
Code:
note = (char**)malloc(korak * sizeof(char*));
Na dalje nisam stigo da pogledam, verovatno ima sličnih grešaka. Trenutno sam malo u žurbi, a i ne razumem tačno šta hoćeš da uradiš. Objasni precizno šta pokušavaš da uradiš, pa ću ti pomoći večeras kad se vratim.


Poz.
[ TomaROGM @ 08.02.2009. 18:10 ] @
Hocu da napravim matricu tipa char, tj. niz stringova, ali velicina matrice nije poznata. Treba da se unosi text sa stdin dok se ne unese prazan string, tj. samo enter. Znaci da svaki red matrice predstavlja string. I na kraju hocu da mi se citav tekst ispise na stdout. A ovo sto si mi naglasio kod 4. reda u main nije greska, to je samo skraceno, radi isto kao i ono sto si ti napisao.
[ Aleksandar Ilić @ 08.02.2009. 19:18 ] @
Citat:
TomaROGM: A ovo sto si mi naglasio kod 4. reda u main nije greska, to je samo skraceno, radi isto kao i ono sto si ti napisao.
To je netačno. U mom prethodnom postu imaš link ka objašnjenju funkcije malloc. Pročitaj.
[ TomaROGM @ 08.02.2009. 22:36 ] @
Da, ispravio sam te greske, ali to ipak nije resenje na moj problem.
[ Aleksandar Ilić @ 09.02.2009. 00:04 ] @
Problem se javlja zato što na početku alociraš samo 5 bloka (korak = 5)
Code:
note = (char**)malloc(korak * sizeof(char*));

a ovaj sledeći kod pokušava da alocira memoriju za string na 6-om mestu kada je duzina = 5, a to 6. mesto je ko zna šta u memoriji.
Code:
if (duzina == alocirano)
{
  for (i=alocirano; i<alocirano+korak; i++)
    note[i] = malloc(20 * sizeof(char));
  alocirano += korak;
}

Program lepo radi za 4 ili manje stringova. Dakle, moraš u ovom drugom delu koda da namestiš da ti povećava note za još dodatnih 5 bloka (korak).