begin process at 2012 05 27 17:52:54
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > PETITE CONSOL

PETITE CONSOL


 Information sur la source

Note :
5,5 / 10 - par 2 personnes
5,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fichiers / Disque Niveau :Débutant Date de création :09/08/2004 Date de mise à jour :09/08/2004 16:26:18 Vu / téléchargé :3 387 / 173

Auteur : ekinoks

Ecrire un message privé
Site perso
Commentaire sur cette source (27)
Ajouter un commentaire et/ou une note

 Description

Salut !
Je debute dans le C et pour m'apprendre a gérré toute sorte de fonctions, j'ai créé une petite consol, un espece de MS-DOS en beacoups plus petit car elle ne contient que 4 fonction ^^

Source

  • EXPLORER.C :
  • ¯¯¯¯¯¯¯¯¯¯
  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <windows.h>
  • #include <unistd.h>
  • #include "dir.h"
  • int main(int argc, char *argv[])
  • {
  • char tmp[30],tmp2[20];
  • char d2[200] = "c:/";
  • printf("Tapez \"help\" pour connaitre la liste des fonctions disponibles\n");
  • while(1)
  • {
  • printf("%s",d2);
  • gets(tmp);
  • if(tmp[0] == 'd' && tmp[1] == 'i' && tmp[2] == 'r')
  • {
  • dir(&d2[0],tmp);
  • } else if(tmp[0] == 'c' && tmp[1] == 'd')
  • {
  • cd(&d2[0],tmp);
  • } else if(!strcmp(tmp, "exit"))
  • {
  • exit(0);
  • } else if(tmp[0] == 's' && tmp[1] == 'e' && tmp[2] == 'a' && tmp[3] == 'r'&& tmp[4] == 'c'&& tmp[5] == 'h')
  • {
  • search(&d2[0],tmp);
  • } else if(tmp[0] == 'h' && tmp[1] == 'e' && tmp[2] == 'l' && tmp[3] == 'p')
  • {
  • help(&d2[0],tmp);
  • }else
  • {
  • printf("\nCette commande n'existe pas\n");
  • }
  • }
  • return 0;
  • }
  • DIR.H :
  • ¯¯¯¯¯
  • #include "cmp.h"
  • help(char *d2, char tmpcd[30])
  • {
  • char *tmpcd2;
  • tmpcd2 = strchr(tmpcd,' ');
  • if (tmpcd2 == NULL)
  • {
  • tmpcd2 = "rien";
  • }
  • else
  • {
  • *tmpcd2++ = 0;
  • }
  • if(!strcmp(tmpcd2, "rien"))
  • printf("Liste des fonctions disponibles :\n- cd\n- dir\n- search\n- exit\nPour en savoir plus sur une de ces fonctions : \"help <nom_de_la_fonction>\"\n");
  • else if(!strcmp(tmpcd2, "cd"))
  • printf("Fonction cd : \"cd <nom_du_dossier>\" ex : 'cd program files'\n");
  • else if(!strcmp(tmpcd2, "dir"))
  • printf("Fonction dir : \"dir\" ou \"dir <Filtre>\" ex : 'dir' ou 'dir *.exe'\n");
  • else if(!strcmp(tmpcd2, "search"))
  • printf("Fonction search : \"search <Filtre>\" ex : 'search *.exe'\n");
  • else if(!strcmp(tmpcd2, "exit"))
  • printf("Fonction exit : \"exit\" ex : 'exit'\n");
  • }
  • scan()
  • {
  • WIN32_FIND_DATA File;
  • HANDLE liste;
  • liste = FindFirstFile("*.*", &File);
  • do
  • {
  • if(File.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // ==> Repertoire
  • {
  • printf("<REP>\t%s\n",File.cFileName);
  • }
  • else // ==> Fichier
  • {
  • printf("\t%s\t%d,%d Ko\n",
  • File.cFileName, // Nom
  • (File.nFileSizeHigh*MAXDWORD+File.nFileSizeLow)/1024, //taille
  • (File.nFileSizeHigh*MAXDWORD+File.nFileSizeLow)%1024);
  • }
  • } while((FindNextFile(liste, &File)));
  • // FindClose() ferme la recherche
  • FindClose(liste);
  • printf("\n");
  • }
  • void parent(char *d2)
  • {
  • int a,b;
  • a=b=0;
  • while(d2[a] != 0)
  • {
  • if(d2[a] == d2[2] && d2[a+1] != 0)
  • {
  • b=a;
  • }
  • a=a+1;
  • }
  • d2[b+1]=0;
  • }
  • dir(char *d2, char tmpcd[30])
  • {
  • char *tmpcd2;
  • tmpcd2 = strchr(tmpcd,' ');
  • if (tmpcd2 == NULL)
  • {
  • tmpcd2 = "*.*";
  • }
  • else
  • {
  • *tmpcd2++ = 0;
  • }
  • SetCurrentDirectory (d2);
  • WIN32_FIND_DATA File;
  • HANDLE liste;
  • liste = FindFirstFile(tmpcd2, &File);
  • do
  • {
  • if(File.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // ==> Repertoire
  • {
  • printf("<REP>\t%s\n",File.cFileName);
  • }
  • else // ==> Fichier
  • {
  • printf("\t%s\t%d,%d Ko\n",
  • File.cFileName, // Nom
  • (File.nFileSizeHigh*MAXDWORD+File.nFileSizeLow)/1024, //taille
  • (File.nFileSizeHigh*MAXDWORD+File.nFileSizeLow)%1024);
  • }
  • } while((FindNextFile(liste, &File)));
  • // FindClose() ferme la recherche
  • FindClose(liste);
  • printf("\n");
  • }
  • cd(char *d2, char tmpcd[30])
  • {
  • char *tmpcd2;
  • tmpcd2 = strchr(tmpcd,' ');
  • if (tmpcd2 == NULL)
  • {
  • printf("\nCette commande n'existe pas\n");
  • return(0);
  • }
  • *tmpcd2++ = 0;
  • strcat(d2, tmpcd2);
  • strcat(d2, "/");
  • if ((SetCurrentDirectory (d2)) == 1 && strcmp(tmpcd2, "."))
  • {
  • if (!strcmp(tmpcd2, ".."))
  • {
  • parent(&d2[0]);
  • parent(&d2[0]);
  • }
  • }
  • else
  • {
  • printf("Le dossier %s n'existe pas.\n", tmpcd2);
  • parent(&d2[0]);
  • }
  • }
  • search(char *d2, char tmpcd[30])
  • {
  • char d3[2000][1000];
  • char *tmpcd2;
  • int i,j,y;
  • tmpcd2 = strchr(tmpcd,' ');
  • if (tmpcd2 == NULL)
  • {
  • printf("Erreur de syntaxe, \"search <nom>\"\n");
  • return(0);
  • }
  • else
  • {
  • *tmpcd2++ = 0;
  • }
  • strcpy(d3[0],d2);
  • j=i=y=0;
  • while(strcmp(d3[0], ""))
  • {
  • SetCurrentDirectory (d3[j]);
  • WIN32_FIND_DATA File;
  • HANDLE liste;
  • liste = FindFirstFile("*", &File); //tmpcd2 est le fichier a trouvé
  • do
  • {
  • if(File.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // ==> Repertoire
  • {
  • if(strcmp(File.cFileName, "..") && strcmp(File.cFileName, "."))
  • {
  • i++;
  • //printf("<REP>\t%s\n",File.cFileName);
  • strcat(d3[i], d3[0]);
  • strcat(d3[i], File.cFileName);
  • strcat(d3[i], "/");
  • if(cmp(File.cFileName, tmpcd2)==0)
  • {
  • y++;
  • printf("%s%s/\n",d3[0],File.cFileName);
  • }
  • }
  • }
  • else if(cmp(File.cFileName, tmpcd2)==0) // ==> Fichier
  • {
  • printf("%s%s\n",d3[0],File.cFileName);
  • y++;
  • }
  • }while((FindNextFile(liste, &File)));
  • FindClose(liste);
  • while(strcmp(d3[j], ""))
  • {
  • strcpy(d3[j],d3[j+1]);
  • j++;
  • }
  • j=0;
  • i--;
  • }
  • printf("%d fichier(s) trouvé\n",y);
  • printf("\n");
  • }
  • CMP.H :
  • ¯¯¯¯¯
  • int cmp(char a[],char b[])
  • {
  • int i,j;
  • j = 0;
  • char *y, *c;
  • for (i=0;i<strlen(a);i++)
  • {
  • if (a[i] > 64 && a[i] < 91)
  • a[i] = a[i] + 32;
  • }
  • for (i=0;i<strlen(b);i++)
  • {
  • if (b[i] > 64 && b[i] < 91)
  • b[i] = b[i] + 32;
  • }
  • for (i=0;i<strlen(b);i++)
  • {
  • if (b[i] == '*')
  • {
  • if (b[i+1]!=0)
  • {
  • if ((c = strchr(&b[i+1],'*')) == NULL)
  • {
  • if (!strcmp(&a[strlen(a)-strlen(&b[i+1])],&b[i+1]))
  • return(0);
  • else
  • return(3);
  • }
  • } else
  • {
  • return(0);
  • }
  • *c = 0;
  • if( (y = strpbrk(&a[j], &b[i+1])) == NULL )
  • return(1);
  • printf("\t%i",y);
  • j=y-a+strlen(&b[i+1]);
  • i=i+strlen(&b[i+1]);
  • y=NULL;
  • if (c != NULL)
  • *c = '*';
  • } else
  • {
  • if ((c = strchr(&b[i+1],'*')) == NULL)
  • {
  • if(!strcmp(a,b))
  • return(0);
  • else
  • return(22);
  • }
  • if(a[j] != b[i])
  • return(2);
  • j++;
  • }
  • }
  • return(0);
  • }
EXPLORER.C :
¯¯¯¯¯¯¯¯¯¯
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <unistd.h>
#include "dir.h"

int main(int argc, char *argv[])
{
    char tmp[30],tmp2[20];
    char d2[200] = "c:/"; 
    printf("Tapez \"help\" pour connaitre la liste des fonctions disponibles\n");
    while(1)
    {
        printf("%s",d2);
        gets(tmp);
        
        if(tmp[0] == 'd' && tmp[1] == 'i' && tmp[2] == 'r')
        {
            dir(&d2[0],tmp);
        } else if(tmp[0] == 'c' && tmp[1] == 'd')
        {
            cd(&d2[0],tmp);
        } else if(!strcmp(tmp, "exit"))
        {
            exit(0);
        } else if(tmp[0] == 's' && tmp[1] == 'e' && tmp[2] == 'a' && tmp[3] == 'r'&& tmp[4] == 'c'&& tmp[5] == 'h')
        {
            search(&d2[0],tmp);
        } else if(tmp[0] == 'h' && tmp[1] == 'e' && tmp[2] == 'l' && tmp[3] == 'p')
        {
            help(&d2[0],tmp);
        }else
        {
            printf("\nCette commande n'existe pas\n");
        } 
        
    }       
    return 0;
}




DIR.H :
¯¯¯¯¯
#include "cmp.h"

help(char *d2, char tmpcd[30])
{
    char *tmpcd2;
    tmpcd2 = strchr(tmpcd,' ');
    if (tmpcd2 == NULL)
    {
        tmpcd2 = "rien";
    }
    else
    {    
        *tmpcd2++ = 0;      
    }
    
    if(!strcmp(tmpcd2, "rien"))
        printf("Liste des fonctions disponibles :\n- cd\n- dir\n- search\n- exit\nPour en savoir plus sur une de ces fonctions : \"help <nom_de_la_fonction>\"\n"); 
    else if(!strcmp(tmpcd2, "cd"))
        printf("Fonction cd : \"cd <nom_du_dossier>\" ex : 'cd program files'\n");
    else if(!strcmp(tmpcd2, "dir"))
        printf("Fonction dir : \"dir\" ou \"dir <Filtre>\" ex : 'dir' ou 'dir *.exe'\n");
    else if(!strcmp(tmpcd2, "search"))
        printf("Fonction search : \"search <Filtre>\" ex : 'search *.exe'\n");
    else if(!strcmp(tmpcd2, "exit"))
        printf("Fonction exit : \"exit\" ex : 'exit'\n");        
}    

scan()
{
    WIN32_FIND_DATA File;
    HANDLE liste;
    liste = FindFirstFile("*.*", &File);
    do
    {
      if(File.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)       // ==> Repertoire
      {
         printf("<REP>\t%s\n",File.cFileName);
      }
      else        // ==> Fichier
      {
          printf("\t%s\t%d,%d Ko\n",
          File.cFileName, // Nom
          (File.nFileSizeHigh*MAXDWORD+File.nFileSizeLow)/1024, //taille
          (File.nFileSizeHigh*MAXDWORD+File.nFileSizeLow)%1024);
      }
   } while((FindNextFile(liste, &File)));
// FindClose() ferme la recherche
   FindClose(liste);     
   printf("\n");
}


void parent(char *d2)
{
    int a,b;
    a=b=0;
    while(d2[a] != 0)
    {
        if(d2[a] == d2[2] && d2[a+1] != 0)
        {
        b=a;
        }    
        a=a+1;
    }    
    d2[b+1]=0;  
}  

dir(char *d2, char tmpcd[30])
{
    char *tmpcd2;
    tmpcd2 = strchr(tmpcd,' ');
    if (tmpcd2 == NULL)
    {
        tmpcd2 = "*.*";
    }
    else
    {    
        *tmpcd2++ = 0;      
    }       
    
    SetCurrentDirectory (d2);     
    WIN32_FIND_DATA File;
    HANDLE liste;
    liste = FindFirstFile(tmpcd2, &File);
    do
    {
      if(File.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)       // ==> Repertoire
      {
         printf("<REP>\t%s\n",File.cFileName);
      }
      else        // ==> Fichier
      {
          printf("\t%s\t%d,%d Ko\n",
          File.cFileName, // Nom
          (File.nFileSizeHigh*MAXDWORD+File.nFileSizeLow)/1024, //taille
          (File.nFileSizeHigh*MAXDWORD+File.nFileSizeLow)%1024);
      }
   } while((FindNextFile(liste, &File)));
// FindClose() ferme la recherche
   FindClose(liste);     
   printf("\n");
}  

cd(char *d2, char tmpcd[30])
{
    char *tmpcd2;
    tmpcd2 = strchr(tmpcd,' ');
    if (tmpcd2 == NULL)
    {
        printf("\nCette commande n'existe pas\n");
        return(0);
    }    
    *tmpcd2++ = 0;  
    strcat(d2, tmpcd2);
    strcat(d2, "/");
    if ((SetCurrentDirectory (d2)) == 1 && strcmp(tmpcd2, ".")) 
    {
        if (!strcmp(tmpcd2, ".."))
        {
            parent(&d2[0]);
            parent(&d2[0]);
        }      
    }
    else
    {
        printf("Le dossier %s n'existe pas.\n", tmpcd2);
        parent(&d2[0]);
    }       
}    

search(char *d2, char tmpcd[30])
{
    char d3[2000][1000];
    char *tmpcd2;
    int i,j,y;
    tmpcd2 = strchr(tmpcd,' ');
    if (tmpcd2 == NULL)
    {
        printf("Erreur de syntaxe, \"search <nom>\"\n");
        return(0);
    }
    else
    {    
        *tmpcd2++ = 0;      
    }    
    strcpy(d3[0],d2);
    j=i=y=0;
    
    while(strcmp(d3[0], ""))
    {
        SetCurrentDirectory (d3[j]);     
        WIN32_FIND_DATA File;
        HANDLE liste;
        liste = FindFirstFile("*", &File);    //tmpcd2 est le fichier a trouvé
        do
        {
          if(File.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)       // ==> Repertoire
          {
             if(strcmp(File.cFileName, "..") && strcmp(File.cFileName, "."))
             {
                 i++;
                 //printf("<REP>\t%s\n",File.cFileName);
                 strcat(d3[i], d3[0]);
                 strcat(d3[i], File.cFileName);
                 strcat(d3[i], "/");
                 if(cmp(File.cFileName, tmpcd2)==0)
                 {
                     y++;
                     printf("%s%s/\n",d3[0],File.cFileName);
                 }
             }        
             
          }
          else if(cmp(File.cFileName, tmpcd2)==0)        // ==> Fichier
          {
              printf("%s%s\n",d3[0],File.cFileName);
              y++;
          }
       }while((FindNextFile(liste, &File)));
       FindClose(liste); 
       
       while(strcmp(d3[j], ""))
       {
           strcpy(d3[j],d3[j+1]);   
           j++;
       }    
       j=0;
       i--;
   }   
   
   printf("%d fichier(s) trouvé\n",y); 
   printf("\n");
}  



CMP.H :
¯¯¯¯¯
int cmp(char a[],char b[])
{   
    int i,j;
    j = 0;
    char *y, *c;
    
    for (i=0;i<strlen(a);i++)
    {
        if (a[i] > 64 && a[i] < 91)
            a[i] = a[i] + 32;    
    }
    for (i=0;i<strlen(b);i++)
    {       
        if (b[i] > 64 && b[i] < 91)  
            b[i] = b[i] + 32;    
    }

    for (i=0;i<strlen(b);i++)
    {
        if (b[i] == '*')
        {
            if (b[i+1]!=0)
            {
                if ((c = strchr(&b[i+1],'*')) == NULL)
                {
                    if (!strcmp(&a[strlen(a)-strlen(&b[i+1])],&b[i+1]))
                        return(0);
                    else
                        return(3);    
                }
            } else
            {
                return(0);
            }    
                      
            *c = 0;            
            if( (y = strpbrk(&a[j], &b[i+1])) == NULL )
            return(1);  
            printf("\t%i",y);  
            j=y-a+strlen(&b[i+1]);
            i=i+strlen(&b[i+1]);
            y=NULL;
            if (c != NULL)
            *c = '*';
        } else
        {
            if ((c = strchr(&b[i+1],'*')) == NULL)
            {
                if(!strcmp(a,b))
                    return(0);
                else
                    return(22);
            }    
            if(a[j] != b[i])
            return(2);
            j++;
        }    
    }    
return(0);       
}

 Conclusion

J'attend avec impatience vos reactions ;)

Ps : Si l'un de vous sais comment ajouté une fonction pour se connecter a des FTP et pouvoir naviger sur les FTP comme je le fait ici dans le disque dur local, qu'il n'esite pas

Merci

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

09 août 2004 00:38:02 :
update
09 août 2004 16:26:18 :
- remplacement de scan.h et cmp.h par scan.c et cmp.c - insertion d'un type de retour pour toute les fonctions

 Sources du même auteur

Source avec Zip PARTAGER SA CONNEXION INTERNET
Source avec Zip SCANNER D'IP
Source avec Zip PROGRAMME DE TRI

 Sources de la même categorie

COMPTER LE NOMBRE DE PAGES D'UN FICHIER PDF par Renfield
Source avec Zip Source avec une capture GENERE BMP par lajouad
Source avec Zip Source avec une capture GETIONNAIRE D'UNE BIBLIOTHÉQUE EN C par benzarabel
FONCTION D'ÉDITION DE FICHIER BIT À BIT [C-MULTIPLATEFORME] par lynxtyle
Source avec Zip Source avec une capture UN GESTIONNAIRE DU FICHIER par benzarabel

Commentaires et avis

Commentaire de cosmobob le 09/08/2004 01:04:03

Une convention en C/C++ est que les fichiers .h ne contiennent que les entetes des fonctions donc on veut se servir dans les .c ou les .cpp et non les fonctions completes ! (sinon ca genere une erreur lorsque tu essaies d'inclure le meme .h dans deux fichiers .c ou .cpp du meme projet). Les fonctions completes se trouvent dans d'autres .c ou .cpp.
Meme si en C c'est accepté, mieux vaut toujours mettre un type de retour pour tes fonctions ou procédures, quitte a mettre 'void' (tu le fais pas pour 'dir(char *d2, char tmpcd[30])' par ex, et d'autres encore ...)
Et sinon quand tu décris ta source, tu pourrais eviter de faire des fautes d'orthographe!!

a+, continue bien ;)

Commentaire de djl le 09/08/2004 02:27:26

quand tu met pa de type retour, ta fonction retourne un int par defaut (type implicite) et à la fin de ta fonction tu retourne rien (void), si tu active les warning, le compilo gueule

Commentaire de ekinoks le 09/08/2004 16:27:29

ha ! ok je ne savais pas tout cela, je vais sur le champs corriger c'est erreur ;)
merci de me l'avoir fait remarqué

Commentaire de snip8 le 09/08/2004 18:38:16

Dans le main(), pourquoi ne pas utiliser :
if(tmp == "dir")
car si l'utilisayeur tappe "direction" par exmple sa passe dans la fonction.
Ou alors tu mets :
if(tmp[0] == 'd' && tmp[1] == 'i' && tmp[2] == 'r' && tmp[3] == '\0')
mais c'est quand même plus propre :
if(tmp == "dir")

Pour rester dans les if du main() :
if(!strcmp(tmp, "exit"))
piur quoi utiliser strcmp() ici alors qu'avant tu compare chaque case du tableau ?
Le mieux c'est encore :
if(tmp == "exit")
l'avantage c'est que tu n'as pas besoin d'appeler une fonction. Enfin c'est à toi de voir, mais soit coérant an adoptant une convention pour que ton code soit plus simple à lire.

A ce propos lorsque tu as un if inutile de mettre des acolades pour une intruction :
if(condition)
        action1;
else
        action2;
Lorsque tu n'as pas besoin des acolades autant les éviter, sa rend plus difficile la lecture du code.

Toujours dans le main() puisque tu fais une boucle infinie et que tu ne passes jamais au return 0, au lieu de : int main(int argc, char *argv[]),
void main(int argc, char *argv[])
et tu enlève le return 0.

Dans dir() à la place de dir(char *d2, char tmpcd[30]) :
void dir(char *d2, char tmpcd[])
ou
dir(char *d2, char *tmpcd)
parait plus adapté.

Sinon sa m'a l'air plutot pas mal.

Bonne continuation.

Commentaire de ekinoks le 10/08/2004 02:21:33

snip8 > effectivement il y a pas mal de truck dont je doit faire la corection maintenent que tu le dit ^^ ...
par contre pour la fonction dir... je ne peu ni utilisé :
if(tmp == "dir")
car j'ai rajouté une option que MS-DOS ne le fait pas en filtant la recherche... un "dir *.exe" afficheré tout les .exe du repertoir dans le quel on se trouve...
Ni utiliser :
if(tmp[0] == 'd' && tmp[1] == 'i' && tmp[2] == 'r' && tmp[3] == '\0')
sur la fonction dir, car l'utilisateur peu faire un "dir" pour affichier tout les fichiers/dossiers sans exeption. par contre pour les autre fonction, je pence qu'il serait plus judicieu d'utilisé l'une des ces deux fonction ;)

Merci pour tes remarques, je fairais une corection demain en y prennent compte .

Commentaire de Kirua le 10/08/2004 02:37:11

snip8 tu peux pas faire tmp == "dir", c'est faux.
tmp est un pointeur sur un tableau de caractères, et "dir" retournera un pointeur sur un tableau créé temporairement. ça ne peut pas être la même adresse, donc ce sera tjs faux.

Commentaire de djl le 10/08/2004 09:51:39

"dir" est une chaine litterale et est donc l'adresse de cette chaine en zone statique, mais ca ne change rien au fait que ce soit faux et que ca cache un gros probleme de comprehension des pointeurs et tableaux

Commentaire de DeAtHCrAsH le 10/08/2004 11:24:32

Pour comparer 2 chaines ya strcmp() en C qui le fait.
Sinon tu peux te créer ta propre fonction  compare tes deux chaines éléments par éléments.
Mais bon comme la dis djl, ya un problème d'incompréhension des pointeurs et tableau.

Shell

Commentaire de Kirua le 10/08/2004 14:09:55

djl, ça veut qd même dire qu'un tableau est créé en mémoire pour l'usage immédiat. de la même façon que quand tu passes un argument par valeur, la valeur passée est créée en mémoire (dans la pile je suppose, mais là je vais pas me prononcer).

Commentaire de djl le 10/08/2004 14:22:09

surtout pas, c'est un pointeur sur l'adresse du la chaine litterale qui est crée, pas un tableau

Commentaire de Kirua le 10/08/2004 15:16:32

mais cette chaîne elle est crée avant d'en retourner l'adresse, et une chaîne c'est un tableau, non (??)

Commentaire de djl le 10/08/2004 15:28:11

c'est un tableau static de caractere non modifiable, sa durrée de vie est celle du programme (c'est en dur) et donc pas un tableau crée pour l'usage immediat

Commentaire de Kirua le 10/08/2004 15:36:24

tu veux dire que" le tableau ne meurt pas à la fin de l'exécution de la fonction? ce serait absurde!

Commentaire de djl le 10/08/2004 15:41:46

void func()
{
    const char *str = "ohojhjhjk";
....
}

str contient l'adresse d'un tableau  static de caractere, ce qui est absurde c'est de croire que ce tableau sera detruit, tu crois qua lea chaine litteral "ohojhjhjk" tombe du ciel ?

par contre

void func()
{
    char str[] = "ohojhjhjk";
...
}

str est un tableau de caractere dont la duree de vie  est celle de l'appel de la fonction (et meurt donc avec)

Commentaire de Kirua le 10/08/2004 15:46:40

c'est ridicul de changer le * et le [].

void foo()
{
const int a = 5; //restera
//de même que:
static int b = 5; //mais c'est pas pareil, b est variable, c'est juste que sa valeur reste au prochain appel de la fonction, alors que pour a, c'est en dur dans l'exécutable.
}

void bar()
{
int a = 5; sera détruit lorsqu'on sortira de sa portée, càd de la fonction
}


ça n'a rien à voir avec les chaînes littérales.

Commentaire de djl le 10/08/2004 15:53:46



const int a = 5; //restera

rien du tout, const n'a aucune  repercution dans le code généré, c'est just une "securité" du compilateur, libre à toi de l'utiliser, ca ne changera rien

je comprend pas l'interet de ces exemples, mais tu a comprisla diffrenece entre

char str[] = "ohojhjhjk";
et
const char *str = "ohojhjhjk";

?

et pour quoi du dis ca ?
"ça n'a rien à voir avec les chaînes littérales."

Commentaire de Kirua le 10/08/2004 15:56:27

ben la différence c'est le const, ça change rien de mettre * ou [], ou bien j'ai encore rien compris (??).
j'aurais pas dû utiliser les <string> tout de suite, finalement j'ai loupé une partie de mon apprentissage :/

Commentaire de djl le 10/08/2004 16:02:03

const char *str = "ohojhjhjk";

str est un pointeur contenant l'adresse du tableau de caractere static contenant la chaine "ohojhjhjk", le const c'est parce que le standard ne peus pas assurer que cette chaine soit placer dans une zone en lecture seul

char str[] = "ohojhjhjk";

str est un tableau local initialiser avec la chaine  litteral "ohojhjhjk"

Commentaire de Kirua le 10/08/2004 16:06:29

ça répond pas à ma question, est-ce que ça:

char *str = "sdfdsf";

c'est équivalent à ça:

char str[] = "sdfdsf";

?

Commentaire de djl le 10/08/2004 16:07:45

non, un pointeur et un tableau sont deux choses differentes

Commentaire de Kirua le 10/08/2004 16:20:47

mais... ça existe pas les tableaux en C, si ?? par exemple, tu pourras jamais passer un tableau en paramètre, c'est tjs un pointeur vers un "tableau", ce qui est en fait juste une zone mémoire. tu passes tjs un pointeur vers le premier élément du tableau, et éventuellement le nb d'éléments qu'il contient.

j'viens de coder ça juste pour voir:

char str1[] = "blabla";
cout << (void*)str1 << endl;
char *str2 = "blabla";
cout << (void*)str2 << endl;

dans les deux cas, j'ai bien une adresse, donc str1 autant que str2 est un pointeur. tableau ça existe pas, en tt cas c'est ce qu'on me bourre ds le crane depuis tjs.

Commentaire de djl le 10/08/2004 16:25:06

et ben c'est faux, str1 est un tableau, c'est une constante contenant l'adresse de sont premier element, c'est bien sur une l-value

str2 est un pointeur...

char str1[] = "blabla";
cout << sizeof str1 << '\n';
char *str2 = "blabla";
cout << sizeof str2 << '\n';

quand tu passe un tableau en parametre, son adresse est copié dans un pointeur

Commentaire de Kirua le 10/08/2004 16:33:13

mince, j'ai en effet 7 octets pour str1 et les 4 octets d'une adresse pour str2, eh beh... si jm'étais douté! ^^ merci d'avoir eu la patience de m'expliquer, me voilà devant le fait ^^ merci bcp :)

Commentaire de djl le 10/08/2004 16:35:28

tu vois, le mieux c'est d'apprendre avec un bouquin car le c comprend beaucoup de mythe :D

Commentaire de longshot41 le 24/04/2007 13:34:11

Très bon site d'apprentissage du C/C++
http://www.siteduzero.com/tuto-3-8-0-apprenez-a-programmer-en-c-c.html?sesid=132dcf68c08800e9fd994ca9459bd3ef38595396&sesmid=-407
Je débute totalement, mais dans ce que je lit, j'ai l'impression qu'il y a pas mal de mélange entre le C et le C++ ??

Commentaire de longshot41 le 24/04/2007 13:37:40

Et à la place des If elseif... un switch ne serait pas plus approprié?
Mais je trouve cool déjà le code que tu as "pondu" pour un début, je ne pense pas que j'en serais capable pour le moment.
Et c'est cool de le publier ainsi que les critiques utiles des autres programmeurs

Commentaire de longshot41 le 24/04/2007 13:47:04

De mon coter, ce que j'ai compris des pointeurs, en gros c'est ça.

Une variable c'est une sorte de boite que l'on va remplire, mais dont le contenu est accessible uniquement dans la fonction qui l'initialize le tout est stocker dans une partie de la mémoire.

Faire un poiteur c'est donner directement les coordonées de la partie de la mémoire ou ce trouve stocké le contenu de la variable.
Donc on passe cette adresse aux fonctions qui vont directement modifier la mémoire. (c'est quand même assez dangereux comme truc quand on y pense, mais c'est absolument génial !!!)

Voilà, j'espère avoir expliqué juste, ça peut aidé certainement quelques personnes qui n'avait pas compris ça. Faut dire que dans les livres, c'est pas tellement expliqué, on te dit juste fais ça comme ça, et tu ne comprends rien, tu ne fait qu'appliquer.

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,421 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales