Accueil > Forum > > > > char**, pointeur et fonction
char**, pointeur et fonction
mercredi 16 avril 2008 à 21:03:42 |
char**, pointeur et fonction

psykocrash
|
Salut,
Je bosse sur un petit programme et je butte sur un problème de pointeurs. Voici le code source qui pose problème : -------------------- #include <stdio.h> #include <string.h> #include <malloc.h>
void make_arguments_table(int argc, char* argv[], char** new_argv);
int main(int argc, char* argv[]) { char** arguments; make_arguments_table(argc, argv, arguments); printf("%d\n", &arguments[0]); return (0); } void make_arguments_table(int argc, char* argv[], char** new_argv) { int arguments_count = argc - 2; int counter = 2; int len = 0; int i=0; new_argv = (char**)malloc(arguments_count * sizeof(char*)); if (new_argv == NULL) printf("Lack of memory space.\n"); for(i=0;i<arguments_count;++i) { new_argv[i] = (char *)malloc((strlen(argv[i+2])+1) * sizeof(char)); if (new_argv[i] == NULL) printf("Lack of memory space.\n"); strcpy(new_argv[i], argv[i+2]); } printf("%d <-\n", &new_argv[0]); } -------------------- Je fais deux printf() de test. Le premier dans make_arguments_table() qui affiche l'adresse de array[0]. Le deuxième, dans main(), affiche a sont tour cette valeur qui devrait être la même... mais qui ne l'est pas.
Est ce que j'pourrais avoir un coup d'main svp ?
|
|
mercredi 16 avril 2008 à 21:20:29 |
Re : char**, pointeur et fonction

luhtor
|
Réponse acceptée !
Tu oublies que ton pointeur que tu envois en argument n'est pas modifié par la fonction. En C++ on ferait ca:
char** arguments; make_arguments_table(argc, argv, arguments);
void make_arguments_table(int argc, char* argv[], char** & new_argv)
En C, faut soit passer par la valeur de retour, soit passer par un pointeur de ton pointeur, soit un (char***) char** make_arguments_table(int argc, char* argv[]) ou void make_arguments_table(int argc, char* argv[], char*** new_argv)
|
|
jeudi 17 avril 2008 à 00:25:07 |
Re : char**, pointeur et fonction

psykocrash
|
J'y arrive pas. Est ce que tu pourrais me donner un exemple concret stp ? (parce qu'avec seulement la déclaration de la fonction, j'ai du mal à comprendre quoi faire a l'interrieur de la fonction).
Merci pour ton aide, luhtor
|
|
jeudi 17 avril 2008 à 12:24:56 |
Re : char**, pointeur et fonction

jfrancois
|
Réponse acceptée !
Bonjour,
arguments est passé par valeur à la fonction make_arguments_table, ce qui fait que les allocations mémoire qui sont faits dans la fonction le sont sur une copie locale de arguments ! Il faut passé l'adresse de arguments pour que ce pointeur soit directement utilisé et modifié (ou passer sa référence, ce qui revient au même puisque le passage par référence n'est rien d'autre qu'un passage par adresse avec une syntaxe de passage par valeur !).
PS: char** x et char* x[] c'est la même chose. Eviter d'utiliser ces 2 syntaxes en même temps, ça donne l'impression que c'est compris comme étant différents.
#include <stdio.h> #include <string.h> #include <malloc.h> void make_arguments_table(int argc,char**,char***); int main(int argc,char** argv) { char** arguments; make_arguments_table(argc,argv,&arguments); printf("main:arguments = %X\n",arguments); printf("main:arguments[0] = %X\n",arguments[0]); return 0; } void make_arguments_table(int argc,char** argv,char*** new_argv) { int arguments_count = argc - 2; int counter = 2; int len = 0; int i=0; *new_argv = (char**)malloc(arguments_count * sizeof(char*)); if (*new_argv == NULL) { printf("Lack of memory space (1)\n"); return; } printf("make_arguments_table:arguments = %X\n",*new_argv); for (i=0 ; i<arguments_count ; ++i) { *new_argv[i] = (char*)malloc((strlen(argv[i + 2]) + 1) * sizeof(char)); if (*new_argv[i] == NULL) { printf("Lack of memory space (2)\n"); return; } printf("make_arguments_table:arguments[%d] = %X\n",i,*new_argv[i]); strcpy(*new_argv[i],argv[i + 2]); } } Ce qui donne (programme test) :
test a b c make_arguments_table:arguments = 4107D0 make_arguments_table:arguments[0] = 4107C0 make_arguments_table:arguments[1] = 4107B0 main:arguments = 4107D0 main:arguments[0] = 4107C0
Jean-François
|
|
vendredi 18 avril 2008 à 15:46:52 |
Re : char**, pointeur et fonction

psykocrash
|
J'ai une erreur lors du malloc sur le array[1] que je n'arrive pas à corriger. Voici le code complet, si vous pouvez me dire où ça cloche ce serait vraiment sympa.
------------------- #include <stdio.h> #include <string.h> #include <time.h> #include <malloc.h>
void make_arguments_table(int argc, char** argv, char*** new_argv); void display_help();
int main(int argc, char** argv) { // No enough arguments if (argc < 3) { display_help(); return (0); } // Wrong first argument (time hh:mm) if (strlen(argv[1]) != 5) { display_help(); return (0); } if ((argv[1][0] < '0' || argv[1][0] > '2') || (argv[1][1] < '0' || argv[1][1] > '9') || (argv[1][2] != ':') || (argv[1][3] < '0' || argv[1][3] > '5') || (argv[1][4] < '0' || argv[1][4] > '9')) { display_help(); return (0); } // Read the time int h=0; int m=0; time_t time_since_1970; struct tm* local_time; // Hour and minute from chars to integers h = (10 * (((int)argv[1][0]) - '0')) + (((int)argv[1][1])-'0'); m = (10 * (((int)argv[1][3]) - '0')) + (((int)argv[1][4])-'0'); if (h < 0 || h > 23 || m < 0 || m > 59) { display_help(); return (0); } // Wait for the right time and execute the commands int counter = 0; char** arguments; while (1) { time(&time_since_1970); local_time = localtime(&time_since_1970); if (1==1 || local_time->tm_hour == h && local_time->tm_min == m) { make_arguments_table(argc, argv, &arguments); while (counter < (argc-2)) { printf("debug:arguments[%d] = %s\n", counter, argv[counter]); counter++; } return (0); } printf("Scheduled: %d:%d\tLocal: %d:%d\n", h, m, local_time->tm_hour, local_time->tm_min); sleep(10); // wait 10 seconds before checking again } return (0); } void make_arguments_table(int argc, char** argv, char*** new_argv) { int arguments_count = argc - 2; int counter = 2; int len = 0; int i=0; *new_argv = (char**)malloc(arguments_count * sizeof(char*)); if (*new_argv == NULL) { printf("Lack of memory space (1)\n"); return; } for(i=0; i<arguments_count; i++) { printf("%d, %d, %s\n", i, (strlen(argv[i + 2]) + 1) * sizeof(char), argv[i + 2]); *new_argv[i] = (char*)malloc((strlen(argv[i + 2]) + 1) * sizeof(char)); printf("fl1g"); if (*new_argv[i] == NULL) { printf("Lack of memory space (2)\n"); return; } printf("fl2g"); strcpy(*new_argv[i],argv[i + 2]); printf("%d: %s\n", i, *new_argv[i]); } }
void display_help() { printf("usage: stask <hh:mm> <command_1> <command_2> <command_n>\n"); printf("Schedule a task.\n"); printf(" <hh:mm>\t: Specify when to execute the command.\n"); printf("\t\t h=hour (00 <= h <= 23).\n"); printf("\t\t m=minute (00 <= h <= 59).\n"); printf(" <command>\t: Command to execute (use quotes if it include spaces).\n"); printf("\t\t You can put several commands.\n\n"); printf("Exemple:\n$ stask 07:00 \"wxvlc /home/username/playlist.m3u\" \"echo OK > stask.log\"\n\n"); } -------------------
|
|
vendredi 18 avril 2008 à 17:11:44 |
Re : char**, pointeur et fonction

jfrancois
|
Réponse acceptée !
Ca marche comme ça ! #include <stdio.h> #include <string.h> #include <time.h> #include <malloc.h> #include <windows.h> // Sleep() void make_arguments_table(int argc,char** argv,char**& new_argv); void display_help(); int main(int argc, char** argv) { // No enough arguments if (argc < 3) { display_help(); return (0); } // Wrong first argument (time hh:mm) if (strlen(argv[1]) != 5) { display_help(); return (0); } if ( (argv[1][0] < '0' || argv[1][0] > '2') || (argv[1][1] < '0' || argv[1][1] > '9') || (argv[1][2] != ':') || (argv[1][3] < '0' || argv[1][3] > '5') || (argv[1][4] < '0' || argv[1][4] > '9') ) { display_help(); return (0); } // Read the time int h=0; int m=0; time_t time_since_1970; struct tm* local_time; // Hour and minute from chars to integers h = (10 * (((int)argv[1][0]) - '0')) + (((int)argv[1][1]) - '0'); m = (10 * (((int)argv[1][3]) - '0')) + (((int)argv[1][4]) - '0'); if (h < 0 || h > 23 || m < 0 || m > 59) { display_help(); return (0); } // Wait for the right time and execute the commands char** arguments; make_arguments_table(argc,argv,arguments); while (1) { time(&time_since_1970); local_time = localtime(&time_since_1970); printf("Scheduled: %02d:%02d\tLocal: %02d:%02d:%02d\n" ,h,m,local_time->tm_hour,local_time->tm_min,local_time->tm_sec); if (local_time->tm_hour == h && local_time->tm_min == m) { printf("time reached\n"); int counter = 0; while (counter < argc - 2) { printf("execute %s\n",arguments[counter]); counter++; } return (0); } Sleep(5000); // wait 5 seconds before checking again } return (0); } void make_arguments_table(int argc,char** argv,char**& new_argv) { int arguments_count = argc - 2; int counter = 2; int len = 0; int i = 0; new_argv = (char**)malloc(arguments_count * sizeof(char*)); if (new_argv == NULL) { printf("Lack of memory space (1)\n"); return; } for(i=0 ; i<arguments_count ; i++) { new_argv[i] = (char*)malloc((strlen(argv[i + 2]) + 1) * sizeof(char)); if (new_argv[i] == NULL) { printf("Lack of memory space (2)\n"); return; } strcpy(new_argv[i],argv[i + 2]); } } void display_help() { printf("usage: stask <hh:mm> <command_1> <command_2> ... <command_n>\n"); printf("Schedule a task.\n"); printf(" <hh:mm>\t: Specify when to execute the command.\n"); printf("\t\t hh = hour (00 <= hh <= 23).\n"); printf("\t\t mm = minute (00 <= mm <= 59).\n"); printf(" <command>\t: Command to execute (use quotes if it includes spaces).\n"); printf("\t\t You can put several commands.\n\n"); printf("Exemple:\n$ stask 07:00 \"wxvlc /home/username/playlist.m3u\" \"echo OK > stask.log\"\n\n"); } Ce qui donne :
stask 17:10 format "copy *.* z:\\" dir Scheduled: 17:10 Local: 17:09:21 Scheduled: 17:10 Local: 17:09:26 Scheduled: 17:10 Local: 17:09:31 Scheduled: 17:10 Local: 17:09:36 Scheduled: 17:10 Local: 17:09:41 Scheduled: 17:10 Local: 17:09:46 Scheduled: 17:10 Local: 17:09:51 Scheduled: 17:10 Local: 17:09:56 Scheduled: 17:10 Local: 17:10:01 time reached execute format execute copy *.* z:\ execute dir
Jean-François
|
|
vendredi 18 avril 2008 à 23:06:46 |
Re : char**, pointeur et fonction

psykocrash
|
ça marche pas chez moi. gcc me renvoit deux erreurs à cause des char**&. (j'ai enlevé le include <windows.h> parce que je suis sous linux, précision concernant le numéro des lignes...)
stask2.c:6: erreur: expected «;", «," or «)" before «&" token stask2.c:84: erreur: expected «;", «," or «)" before «&" token
|
|
vendredi 18 avril 2008 à 23:34:20 |
Re : char**, pointeur et fonction

jfrancois
|
C'est compilé en C ou en C++ ? Jean-François
|
|
samedi 19 avril 2008 à 03:11:06 |
Re : char**, pointeur et fonction

psykocrash
|
C'est compilé en C sous ubuntu 7.10 avec gcc.
|
|
samedi 19 avril 2008 à 09:48:55 |
Re : char**, pointeur et fonction

jfrancois
|
Réponse acceptée !
Il faut compiler en C++, le passage par référence n'existe pas en C. Jean-François
|
|
Cette discussion est classée dans : int, char, argv, arguments, argc
Répondre à ce message
Sujets en rapport avec ce message
Utilisation des arguments int argc et char *argv[] [ par christophedlr ]
Bonjour à tous,Je voudrais savoir comment faire pour tester si un argument de la ligne de commande est par exemple --help pour afficher l'aide par exe
int main(int argc, char ** argv) [ par agent 047 ]
Bonjour,mon probleme se porte sur le paramètre "char **argv" de la fonction principale utile pour connaître les adresses de chaque argument.Par exempl
Conversion de char en int ? [ par jnbrunet ]
Salut,Je débute en c++... dans mon programme j'aimerai additionner les valeurs entrées en argument dans le main (argv). Le problème est que la variabl
char **argv [ par iam_myst ]
bonjour je pense que c'est vraiment un problème de débutant mais la je suis perplexe :( si on a un programme pricipal de ce type : int main(int a
Logiciels & librairies Microsoft: définitivement buggés ? [ par BenjZ ]
Salut à tous, Je développe depuis 2 jours un petit logiciel de stéganographie tout bête: il code un fichier dans une bitmap sur les bits de poids faib
Petite interrogation sur le main [ par jeromedu94 ]
Bonjour,Lorsque je crée un projet, dans le fichier C j'ai ça : int main(int argc, char *argv[])Et je voudrais savoir à quoi corresponde argc et
[C] Méthode (Fonction, procédure) interne, locale [ par nitrique ]
Bonjour @ tous,J'aimerais faire un fonction locale (c'est à dire: Dans ma fonction)Mais ça pête.int SaisiePasse(char matricule[lMaxCode]) { char to
Variable de type char [ par wolfcyber ]
bonjour, J'aimerais savoir l'equivalent en C++ de la fonction "Mid(int nStart,int nCount)" de la classe CString, pour une variable de type char. Cet
récupérer les arguments sous Windows [ par raymond876 ]
Bonjour,Je voudrait faire un programme invisible sous windows :donc pour cela je remplace : int main (int argc, char *argv[] )par : int</FONT
Livres en rapport
|
Derniers Blogs
SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|