spilia Δημοσ. 8 Απριλίου 2011 Share Δημοσ. 8 Απριλίου 2011 Καλησπερα εχω προβλημα με αυτη την συναρτηση. sprintf(pid, "%d\n", getpid()) γραφω αυτη την συναρτηση αυτο που θελω να ρωτησω ειναι πως οπως ειδα οτι η μεταβλητη pid γινεται τυπου char και ας την εχω δηλωσει πιο πριν ως int. Γνωριζει κανεις γιατι γινεται αυτο? ευχαριστω Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
parsifal Δημοσ. 8 Απριλίου 2011 Share Δημοσ. 8 Απριλίου 2011 Λίγο αμφίβολο να αλλάζει ο τύπος της μεταβλητής από int σε char. Πώς το έλεγξες; Αλλά δεν έχει και ιδιαίτερη σημασία αυτό, γιατί το πρωτότυπο της sprintf είναι ως εξής: >int sprintf ( char * str, const char * format, ... ); Δηλαδή, δέχεται ως πρώτο όρισμα δείκτη σε char. Εσύ δεν περνάς δείκτη σε char, αλλά μία int μεταβλητή και ο compiler σου κανονικά θα πρέπει να σε προειδοποίησε με σχετικό warning. Π.χ. ο ακόλουθος κώδικας: > #include <stdio.h> int main() { int pid = 0; sprintf(pid, "%d\n", 128); return 0; } κατά το compile με GCC δίνει τα παρακάτω warnings: > parsifal@vmubuntu32:/tmp$ gcc -Wall -o test test.c test.c: In function ‘main’: test.c:6: warning: passing argument 1 of ‘sprintf’ makes pointer from integer without a cast /usr/include/stdio.h:361: note: expected ‘char * __restrict__’ but argument is of type ‘int’ και φυσικά, αν εκτελέσεις το binary παίρνεις ένα ωραιότατο segfault: > parsifal@vmubuntu32:/tmp$ ./test Segmentation fault Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
spilia Δημοσ. 8 Απριλίου 2011 Μέλος Share Δημοσ. 8 Απριλίου 2011 >#include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <string.h> #include <stdlib.h> int i, j, stat, ret, n, tyxaios, fd[4], num[4]; int sum, k, cpid, number; char str, ch, buff[200], pid[100], ppid[100]; main(int argc, char *argv[]){ //Elegxos gia to an dothikan 3 orismata apton xrhsth if (argc!=4){ printf("Need 3 file names plz\n"); exit(1); } for (i=1; i<=3; i++){ fd[i]=open(argv[i], O_WRONLY | O_CREAT | O_TRUNC,0644); //Anoigma arxeiou gia diavasma kai grapsimo (dhmiourgia an den yparxei) if (fd[i]==-1){ //Elegxos gia to an ypirkse sfalma perror("open"); exit(2); } ret=fork(); //Dhmiourgia paidiou if (ret==-1){ //kai elegxos gia tyxon sfalma perror("fork"); exit(3); } if (ret!=0){ //O pateras wait(&stat); //perimenei to paidi na teliwsei }else{ sprintf(pid, "%d\n", getpid()); //To pid tou paidiou apothikevete sto pid kai metatroph se string n=write(fd[i],pid,strlen(pid)); //Grapsimo se arxeio tyxaios=rand(); sprintf(ppid, "%d\n", tyxaios*getppid()); //PPid*tyxaio_arithmo kai metatroph se string n=write(fd[i],ppid, strlen(ppid)); //Grapsimo ppid*tyxaio_arithmo sto arxeio close(fd[i]); //Kleisimo arxeiou return(20); //Termatismos paidiou } Εχω φτιαξει κατι τετοιο.αυτο ειναι το πρωτο κομματι.με δυσκολευε να δωσω τιμη στον pid kai ppid επειδη στο write τα ηθελα char αλλα εξ αρχης ηταν int . προσπαθησα αρχικα με >(char) pid=getpid(); αλλα μ εβγαζε λαθος. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
parsifal Δημοσ. 8 Απριλίου 2011 Share Δημοσ. 8 Απριλίου 2011 Μάλιστα, κατάλαβα. Για μετατροπή ενός ακεραίου σε αλφαριθμητικό, υπάρχει η itoa, αλλά δυστυχώς δεν είναι standard ANSI C function αν σε ενδιαφέρει το portability του κώδικα. Η άλλη λύση είναι με την χρήση της sprintf, όπως κάνεις ήδη. Για τις ανάγκες του κώδικά σου πάντως, δε νομίζω πως χρειάζεσαι δύο διαφορετικά strings (και pid και ppid μεταβλητή), απλά έναν μόνο προσωρινό πίνακα χαρακτήρων που θα του δίνεις τιμή με την sprintf (από τις integer πλέον μεταβλητές pid και ppid), αμέσως πριν κάνεις την αντίστοιχη κλήση της write. Και σίγουρα δεν χρειάζεται να έχει τόσο μεγάλο μέγεθος. Δε νομίζω πως υπάρχει λειτουργικό στο οποίο θα δεις PIDs μήκους 99 ή 100 ψηφίων! Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
spilia Δημοσ. 8 Απριλίου 2011 Μέλος Share Δημοσ. 8 Απριλίου 2011 δοκιμασα την συναρτηση που μ ειπες αλλα δεν βοηθησε. εχει και αλλο κομματι κωδικα οπου πρεπει να εχω διαθεσιμους και πιδ και ππιντ ωστε να τα χρησιμοποιω. και μια ερωτηση λιγο ασχεητ με τα παραπανω wait(&stat); στο στατ μπορω να βαλω οτι μεταβλητη θελω σωστα? δηλαδη μπορουσα να βαλω μεσα οτι να ναι αρκει να το δηλωνα παραπανω. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
parsifal Δημοσ. 8 Απριλίου 2011 Share Δημοσ. 8 Απριλίου 2011 δοκιμασα την συναρτηση που μ ειπες αλλα δεν βοηθησε. εχει και αλλο κομματι κωδικα οπου πρεπει να εχω διαθεσιμους και πιδ και ππιντ ωστε να τα χρησιμοποιω. Γιατί δε βοήθησε, τί ακριβώς πήγε στραβά; και μια ερωτηση λιγο ασχεητ με τα παραπανω wait(&stat); στο στατ μπορω να βαλω οτι μεταβλητη θελω σωστα? δηλαδη μπορουσα να βαλω μεσα οτι να ναι αρκει να το δηλωνα παραπανω. Απ' όσο θυμάμαι από τα Λειτουργικά, μία οποιαδήποτε int μεταβλητή την οποία προφανώς και πρέπει να έχεις δηλώσει. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
spilia Δημοσ. 8 Απριλίου 2011 Μέλος Share Δημοσ. 8 Απριλίου 2011 εβγαζε ερρορ ,δηλαδη νομιζω δεν την υποστιριζει!ευχαριστω πολυ για την βοηθεια.ειμαι σιγουρος πως στο μελλον θα σε ξαναχρειαστω καθως τωρα προσπαθω να μαθω. καλο σου βραδυ! Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.