Vous n'êtes pas identifié.
Pages: 1 2
voila je voudrais allouer dynamiquement un tab de pointeur char.
en fait j'ai l'intention d'utiliser realloc après.
voila merci à ceux qui pourront m'aider. car moi j'essaie mais j'y arrive pas.
Hors ligne
ben en cpp c'est facile...
char** tab = new char* [taille_tab];
mais en C...
Hors ligne
ca ne marche po et ca m'enerve !
#include <stdio.h> #include <stdlib.h> int main() { char **tab=NULL; char *string="TOTO"; int i=0,fin=0; do { i=i+1; printf("tab[%d]= %sn",i,string); tab=(char **)realloc( tab, i* strlen(string) * sizeof(char) ); if( tab!=0 ) { strcpy( tab[i-1],string ); printf( "%sn",tab[i-1] ); } else fin=1; } while( fin!=1); return 0; }
Hors ligne
Question: pourquoi fais-tu du C (et pas du Cpp)?
Hors ligne
je suis comme julien, je préfère le C++
mais essaye ca :
char **ptr;
ptr = (char**)malloc( size ); //alloue
....
free(ptr);//libère
Hors ligne
moi aussi je commence à pencher de plus en plus vers le C. mais je compte finir mon explorer en C et commencer mon nouveau en C++ (je me vois déjà galérer comme un porc... )
Hors ligne
c'est normale, la fonction s'appelle realloc, alloue déjà un peu de mémoire avec malloc et ça marchera
ou alors initialise tab avec le pointeur NULL pour que realloc se comporte comme malloc:
char **tab=NULL;
Hors ligne
J'ai réediter mon code sources. Ca ne marche toujours pas.
Si kk1 passe dans les parages et kil a la solution...
ce serait cool de la donner ! lol
Hors ligne
pour allouer un tableau à 2 dimensions (ce qu'est un tableau de char*) :
// allouer les lignes et init à NULL (important si ttes les lignes ne sont pas allouées par la suite):
char** tab = new char*[nLineCount];
memset(tab, 0, nLinecount*sizeof(char*));
// allouer chaque chaine :
for(int i = 0; i < nLineCount; i++)
tab[i] = new char[nLineLength];
// libération des chaines:
for(int i = 0; i < nLineCount; i++)
{
if(tab[i] != NULL)
delete[] tab[i];
}
// libération tableau :
delete[] tab;
doit marcher avec malloc & cie
Hors ligne
ça c'est du c++...
Hors ligne
ben en fait fo d'abord déclarer le tablo de pointeurs, puis lui allouer de l'espace, puis allour de l'espace mémoire a chak pointeur
char **tab=(char **)malloc(X*sizeof(char *));
for(i=0;i<X;i++)
tab[i]=malloc(Y*sizeof(char))
avec X le nombre de chaines de caractères que tu veux
et Y le nombre de caractères dans la chaine
dans ton prog ca marche pas paske strlen compte les caractères jusko
or ta chaine "TOTO" ya pas de donc ca bug
par contre strlen retourne la longueur de la chaine sans
exemple : strlen("TOTO") --> bigbug
strlen("TOTO ") --> 4
donc si tu veux faire un strcpy il faut que tu fasse un malloc de (strlen(string)+1)*sizeof(char)
et pour faire realloc fo avoir fait un malloc avant
Hors ligne
"TOTO" fait bien 5 caractères, c'est équivalent à {'T','O','T','O',' '}
strlen("TOTO") renverra 4, strlen("TOTO ") renverra 5.
(du moins, c'est ce qu'il me semble )
Hors ligne
Erreur dans la chaine "TOTO" ya le caractère ' ' qui est ajouté par le compilo.
Pour vérifier tu écris ceci : static char buf[] = "TOTO", et sizeof(buf) va retourner 5 et pas 4.
Ton code ne marche pas casioworld car ton allocation (ou réallocation) n'est pas correcte.
Tu alloues 'i' fois la taille de ton string pour ton tableau à deux dimmensions, or dans ta déclaration du tableau tab, tu dis que c un char** tab.
donc quand tu fais tab[1] tu vas chercher la valeur (une adresse) se trouvant à 2 octets plus loin que tab[0].
Mais les valeurs de tab[1] et tab[0] (qui correspondent à l'adresse d'un objet à pointer) être n'importent quoi.(c pas forcement linéraire dans la mémoire)
Alloue d'abord 'i' * sizeof(char*) pour tab
Ensuite alloue pour chaque élément du tableau tab[0], tab[1], ...., tab[i - 1];
Sachant qu'un strcpy n'est pas obligé dans ton exemple, mais un simple tab[i] = string suffit. Dans ce dernier cas, pas besoin d'allocation, car tu fais pointé tab[i] sur string, c juste une affectation.
int main() { char **tab=NULL; char *string="TOTO"; const int max = 10; int i=0; tab=(char **)realloc( tab, i * sizeof(char) ); while( tab && i < 10) { printf("tab[%d]= %sn",i,string); if( tab!=0 ) { tab[i] = string;//sans allocation //avec copie donc allocation (moins rapide) tab[i] = (char*)malloc(10);//alloue 10 octets (suffisant) strcpy( tab[i-1],string ); printf( "%sn",tab[i] ); //pour désallouer //free(tab[i]); } ++i; } return 0; }
Hors ligne
@julien: non, strlen("TOTO ") renverra 4, car strlen s'arrete au premier 0 rencontré
Hors ligne
J'avoue tu m'as bien aider en disant:
" Tu alloues 'i' fois la taille de ton string pour ton tableau à deux dimmensions, or dans ta déclaration du tableau tab, tu dis que c un char** tab.
donc quand tu fais tab[1] tu vas chercher la valeur (une adresse) se trouvant à 2 octets plus loin que tab[0]."
j'ai compris mon erreur. mais j'arrive à faire marcher mon truc.
G fait ca :
#include <stdio.h> #include <stdlib.h> int main() { char* (*tab)=NULL; char *string="TOTO"; int i=0,fin=0; do { tab=(char *)realloc( tab, sizeof(char*) ); if( tab!=0 ) { tab[i]=string; printf( "%sn",tab[i] ); } else fin=1; i=i+1; } while( fin!=1); return 0; }
je dois pas etre loin ! :evil:
Hors ligne
@julien: non, strlen("TOTO ") renverra 4, car strlen s'arrete au premier 0 rencontré
oui c juste, comme l'a dit dada c'est sizeof() qui renverra 5 :oops:
"tab=(char *)realloc( tab, sizeof(char*) );"
Ca ne serait pas "tab=(char **)realloc( tab, sizeof(char*) );" plutôt?
Mais j'ai pas trop compris l'idée: tu alloues de la mémoire jusqu'a ce qu'elle soit saturée?
Hors ligne
en fait c pour mon lecteur de fichier texte. à chaque ligne trouvé, je l'ajouteà mon tablo.
pour l'instant c vrai ke j'alloue jusqu'a saturation.
en fait je crois ke ca fonctionne maintenant. c bizarre. mon pc bloque à 2219 reallocation ! je trouve ca pas bcp
Hors ligne
ca dépend de la taille de ton exe. Si ton exe est proche des 64Ko tu ne pourras pas allouer bcp plus. A moins de changer le modèle memoire (HUGE par exemple).
Par contre s'arrive pas à trop comprendre ton 2eme exemple (le 1er aussi lol).
do { tab=(char *)realloc( tab, sizeof(char*) ); if( tab!=0 ) { tab[i]=string; printf( "%sn",tab[i] ); } else fin=1; i=i+1; }while( fin!=1);
dans tab tu n'alloues qu'un pointeur tab[0], or tu fais tab[i] = string, remplace plutot la première ligne du 'do' par:
tab=(char *)realloc( tab, (i + 1)*sizeof(char*) );
Hors ligne
ah mais ou je fais n'importe koi. merci Dada. tout marche nikel. je monte à plus de 30000 reallocation ( j'ai stoper au bout d'un moment). ca me plait bcp mieux.
franchement merci bcp !
le code est donc:
#include <stdio.h> #include <stdlib.h> int main() { char* (*tab)=NULL; char *string="TOTO"; int i=0,fin=0; do { i=i+1; tab=(char **)realloc( tab, (i + 1)*sizeof(char*) ); if( tab!=0 ) { tab[i-1]=string; printf( "%d %sn",i,tab[i-1] ); } else fin=1; } while( fin!=1); return 0; }
Hors ligne
ca à l'air bon à part que (i + 1)*sizeof(char*) peut être remplacé par i*sizeof(char*) vu que tu fais i=i+1 o début de ta boucle, mais c juste un détail
Hors ligne
ah oui j'avais vu ca. comme tu dis c rien. bon bah mon viewer de fichier texte sera nikel.
Hors ligne
D'ailleurs, tu peux changer
i=i+1 par i+=1...
Quitte à simplifier, on peut pas allouer directement à tab[] la chaîne string? Ca simplifierai les manip, et éviterai d'avoir 50 variables temporaires...
Hors ligne
D'ailleurs, tu peux changer
i=i+1 par i+=1...
Quitte à simplifier, on peut pas allouer directement à tab[] la chaîne string? Ca simplifierai les manip, et éviterai d'avoir 50 variables temporaires...
oui bon dans ce cas la tu marques i++ :P
Hors ligne
lol pourquoi pas :
++i
et puis aussi pourquoi pas :
asm inc i;
n'empeche qu'en C++ c'est mieux
Hors ligne
int j=1; i = i+j;
:ptdr:
Hors ligne
Pages: 1 2