Forum Graph100

Forum Graph100

Vous n'êtes pas identifié.

Annonce

Bonjour et bienvenue sur le nouveau Forum Graph100 !
L'intégralité des données a été transférée sur un forum PunBB et tout les comptes sont fonctionnels avec le même nom d'utilisateur et mot de passe.
Un wiki est aussi disponible avec le même compte ! N'oubliez pas de remettre votre avatar, bon surf !
Pour plus d'informations, consultez ce post.

#1 21 Jun 2004 14:50:26

casioworld
Programmeur Graph100
Lieu: Palaiseau (Essonne)
Date d'inscription: 08 Feb 2002
Messages: 1843
Site web

Comment allouer dynamiquement un tablo de pointeur ?

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.


- http://www.casioworld.wb.st  --> plus grande base de données pour Graph100+
- http://efreidelirium.free.fr --> vive l'EFREI mdr

Hors ligne

 

#2 21 Jun 2004 14:57:41

Julien
C++iste convaincu
Lieu: Waterloo (Be)
Date d'inscription: 29 May 2002
Messages: 1456
Site web

Re: Comment allouer dynamiquement un tablo de pointeur ?

ben en cpp c'est facile...
char** tab = new char* [taille_tab];
mais en C...  roll


Pensez à surveiller mes releases wink

Hors ligne

 

#3 21 Jun 2004 15:01:48

casioworld
Programmeur Graph100
Lieu: Palaiseau (Essonne)
Date d'inscription: 08 Feb 2002
Messages: 1843
Site web

Re: Comment allouer dynamiquement un tablo de pointeur ?

ca ne marche po et ca m'enerve !

Code:

#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;
} 

- http://www.casioworld.wb.st  --> plus grande base de données pour Graph100+
- http://efreidelirium.free.fr --> vive l'EFREI mdr

Hors ligne

 

#4 21 Jun 2004 15:02:39

Julien
C++iste convaincu
Lieu: Waterloo (Be)
Date d'inscription: 29 May 2002
Messages: 1456
Site web

Re: Comment allouer dynamiquement un tablo de pointeur ?

Question: pourquoi fais-tu du C (et pas du Cpp)?  lol


Pensez à surveiller mes releases wink

Hors ligne

 

#5 21 Jun 2004 17:36:18

dada66
Membre Communauté Graph100
Lieu: Perpignan
Date d'inscription: 09 Oct 2002
Messages: 1033

Re: Comment allouer dynamiquement un tablo de pointeur ?

je suis comme julien, je préfère le C++

mais essaye ca :

char **ptr;
ptr  = (char**)malloc( size ); //alloue
....
free(ptr);//libère


Flash100, F100Console, GComm, ... : http://flash100.free.fr/xoops

Hors ligne

 

#6 21 Jun 2004 18:14:27

casioworld
Programmeur Graph100
Lieu: Palaiseau (Essonne)
Date d'inscription: 08 Feb 2002
Messages: 1843
Site web

Re: Comment allouer dynamiquement un tablo de pointeur ?

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... )


- http://www.casioworld.wb.st  --> plus grande base de données pour Graph100+
- http://efreidelirium.free.fr --> vive l'EFREI mdr

Hors ligne

 

#7 21 Jun 2004 21:12:32

2072
Programmeur Graph100
Lieu: Somewherebourg
Date d'inscription: 29 Jan 2002
Messages: 2056
Site web

Re: Comment allouer dynamiquement un tablo de pointeur ?

c'est normale, la fonction s'appelle realloc, alloue déjà un peu de mémoire avec malloc et ça marchera  wink

ou alors initialise tab avec le pointeur NULL pour que realloc se comporte comme malloc:

Code:

char **tab=NULL;

-~2072~-
Paid Emails
[URL=http://www.2072productions.com]2072productions.com[/URL]
[URL=http://www.casiocalc.org]casiocalc.org[/URL]

Hors ligne

 

#8 22 Jun 2004 05:44:42

casioworld
Programmeur Graph100
Lieu: Palaiseau (Essonne)
Date d'inscription: 08 Feb 2002
Messages: 1843
Site web

Re: Comment allouer dynamiquement un tablo de pointeur ?

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


- http://www.casioworld.wb.st  --> plus grande base de données pour Graph100+
- http://efreidelirium.free.fr --> vive l'EFREI mdr

Hors ligne

 

#9 22 Jun 2004 06:55:43

ymorgan
Membre
Date d'inscription: 10 Apr 2004
Messages: 35

Re: Comment allouer dynamiquement un tablo de pointeur ?

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

 

#10 22 Jun 2004 08:20:34

Julien
C++iste convaincu
Lieu: Waterloo (Be)
Date d'inscription: 29 May 2002
Messages: 1456
Site web

Re: Comment allouer dynamiquement un tablo de pointeur ?

ça c'est du c++... roll


Pensez à surveiller mes releases wink

Hors ligne

 

#11 22 Jun 2004 08:54:14

nykosledieu
Team G100
Lieu: Strasbourg
Date d'inscription: 29 Jan 2002
Messages: 3028
Site web

Re: Comment allouer dynamiquement un tablo de pointeur ?

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


Nykosledieu
nykosJEMMERDELESPAM@graph100.com - http://team.graph100.com
Venez sur le chat !!

Hors ligne

 

#12 22 Jun 2004 10:42:24

Julien
C++iste convaincu
Lieu: Waterloo (Be)
Date d'inscription: 29 May 2002
Messages: 1456
Site web

Re: Comment allouer dynamiquement un tablo de pointeur ?

"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  lol )


Pensez à surveiller mes releases wink

Hors ligne

 

#13 22 Jun 2004 11:06:45

dada66
Membre Communauté Graph100
Lieu: Perpignan
Date d'inscription: 09 Oct 2002
Messages: 1033

Re: Comment allouer dynamiquement un tablo de pointeur ?

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.

Code:

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; 
} 

Flash100, F100Console, GComm, ... : http://flash100.free.fr/xoops

Hors ligne

 

#14 22 Jun 2004 12:14:05

mastermage
Magicien G100
Lieu: Charleville-Mézières,Compiègne
Date d'inscription: 31 Jan 2002
Messages: 1008

Re: Comment allouer dynamiquement un tablo de pointeur ?

@julien: non, strlen("TOTO") renverra 4, car strlen s'arrete au premier 0 rencontré

Hors ligne

 

#15 22 Jun 2004 12:24:21

casioworld
Programmeur Graph100
Lieu: Palaiseau (Essonne)
Date d'inscription: 08 Feb 2002
Messages: 1843
Site web

Re: Comment allouer dynamiquement un tablo de pointeur ?

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 :

Code:

#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:


- http://www.casioworld.wb.st  --> plus grande base de données pour Graph100+
- http://efreidelirium.free.fr --> vive l'EFREI mdr

Hors ligne

 

#16 22 Jun 2004 12:33:29

Julien
C++iste convaincu
Lieu: Waterloo (Be)
Date d'inscription: 29 May 2002
Messages: 1456
Site web

Re: Comment allouer dynamiquement un tablo de pointeur ?

@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? yikes

Mais j'ai pas trop compris l'idée: tu alloues de la mémoire jusqu'a ce qu'elle soit saturée?  lol


Pensez à surveiller mes releases wink

Hors ligne

 

#17 22 Jun 2004 13:18:44

casioworld
Programmeur Graph100
Lieu: Palaiseau (Essonne)
Date d'inscription: 08 Feb 2002
Messages: 1843
Site web

Re: Comment allouer dynamiquement un tablo de pointeur ?

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


- http://www.casioworld.wb.st  --> plus grande base de données pour Graph100+
- http://efreidelirium.free.fr --> vive l'EFREI mdr

Hors ligne

 

#18 22 Jun 2004 13:28:30

dada66
Membre Communauté Graph100
Lieu: Perpignan
Date d'inscription: 09 Oct 2002
Messages: 1033

Re: Comment allouer dynamiquement un tablo de pointeur ?

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).

Code:

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*) );


Flash100, F100Console, GComm, ... : http://flash100.free.fr/xoops

Hors ligne

 

#19 22 Jun 2004 13:33:44

casioworld
Programmeur Graph100
Lieu: Palaiseau (Essonne)
Date d'inscription: 08 Feb 2002
Messages: 1843
Site web

Re: Comment allouer dynamiquement un tablo de pointeur ?

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:

Code:

#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;
} 

- http://www.casioworld.wb.st  --> plus grande base de données pour Graph100+
- http://efreidelirium.free.fr --> vive l'EFREI mdr

Hors ligne

 

#20 22 Jun 2004 13:39:11

dada66
Membre Communauté Graph100
Lieu: Perpignan
Date d'inscription: 09 Oct 2002
Messages: 1033

Re: Comment allouer dynamiquement un tablo de pointeur ?

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  cool


Flash100, F100Console, GComm, ... : http://flash100.free.fr/xoops

Hors ligne

 

#21 22 Jun 2004 13:40:31

casioworld
Programmeur Graph100
Lieu: Palaiseau (Essonne)
Date d'inscription: 08 Feb 2002
Messages: 1843
Site web

Re: Comment allouer dynamiquement un tablo de pointeur ?

ah oui j'avais vu ca. comme tu dis c rien. bon bah mon viewer de fichier texte sera nikel.


- http://www.casioworld.wb.st  --> plus grande base de données pour Graph100+
- http://efreidelirium.free.fr --> vive l'EFREI mdr

Hors ligne

 

#22 22 Jun 2004 13:46:23

Spesiel
Testeur G100
Lieu: Le Mans
Date d'inscription: 06 Feb 2002
Messages: 598
Site web

Re: Comment allouer dynamiquement un tablo de pointeur ?

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...


No matter where you are, everyone is always connected...

Hors ligne

 

#23 22 Jun 2004 13:57:58

nykosledieu
Team G100
Lieu: Strasbourg
Date d'inscription: 29 Jan 2002
Messages: 3028
Site web

Re: Comment allouer dynamiquement un tablo de pointeur ?

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


Nykosledieu
nykosJEMMERDELESPAM@graph100.com - http://team.graph100.com
Venez sur le chat !!

Hors ligne

 

#24 22 Jun 2004 14:04:08

mastermage
Magicien G100
Lieu: Charleville-Mézières,Compiègne
Date d'inscription: 31 Jan 2002
Messages: 1008

Re: Comment allouer dynamiquement un tablo de pointeur ?

lol pourquoi pas :

Code:

++i

et puis aussi pourquoi pas :

Code:

asm inc i;

n'empeche qu'en C++ c'est mieux

Hors ligne

 

#25 22 Jun 2004 16:08:04

Julien
C++iste convaincu
Lieu: Waterloo (Be)
Date d'inscription: 29 May 2002
Messages: 1456
Site web

Re: Comment allouer dynamiquement un tablo de pointeur ?

Code:

int j=1;
i = i+j;

:ptdr:


Pensez à surveiller mes releases wink

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr