problema programmazione C - aiutooooo!!!


xiloforo
 Share

Recommended Posts

  • Replies 41
  • Created
  • Last Reply

Top Posters In This Topic

inoltre ho fatto alcune modifiche, e sembra funzionare. L'unico problema è che invece di mandare in uscita tutta la stringa, manda solo il primo carattere...

ecco qui:

#include <stdio.h>

#include <math.h>

main ()

{

char nomefunz (int num);

int num;

char *prova;

printf("numero: ");

scanf("%d",&num);

prova=nomefunz(num);

printf("%s",&prova);

}

char nomefunz (num2)

int num2;

{

char *prova2;

if (num2>5)

{

prova2='c','i';

}

return(prova2);

}

Link to comment
Share on other sites

dunque innanzi tutto tieni presente che il C essendo un linguaggio un pochino professionale da messaggi un po' strampalati, inoltre con l'uso dei puntatori (char * e' un puntatore) puo' succedere di tutto se non sei preciso.

Dopo questa premessa ti elenco le cose che non vanno ...

char nomefunz(num2)

...

{

char *prova2;

...

questa dichiarazione non alloca la memoria

quindi devi fare

char *prova2 = malloc(3*sizeof(char));

per avere una stringa di 2 caratteri + terminatore

...

if(num2>5)

{

prova2[0]='c';

prova2[1]='i';

prova2[2]='\0';

}

...

devi scrivere carattere per carattere o in

alternativa

strcpy(prova2, "ciao");

...

return(prova2);

}

prova ora vediamo che succede ;)

Link to comment
Share on other sites

ho messo questo, come mi hai detto te....per qualsiasi numero inserisco mi da come uscita \300\377\377\377

che faccio? rinuncio?.... :(

#include <stdio.h>

#include <math.h>

main ()

{

char nomefunz (int num);

int num;

char *prova;

printf("numero: ");

scanf("%d",&num);

prova=nomefunz(num);

printf("%s",&prova);

}

char nomefunz (num2)

int num2;

{

char *prova2 = malloc(3*sizeof(char));

if (num2>5)

{

prova2[0]='c';

prova2[1]='i';

prova2[2]='\0';

}

return(prova2);

}

Link to comment
Share on other sites

Si sono sempre distratto, nella main() questa riga e' sbagliata

prova[2]=nomefunz(num);

devi mettere

strcpy(prova, nomefunz(num));

cioe' copi la stringa generata nello stack

nella stringa locale, dopodiche' la stampa andra'

Ah per terminologia quando dici che ti da errore specifica se e' un errore di compilazione o di esecuzione e riporta cosa scrive ;)

Ciao

se non erro però, per usare la funzione strcpy (x copiare le stringhe) devi mettere anche:

#include<string.h>

Link to comment
Share on other sites

Dunque l'unico problema che vedo e' con un numero inferiore a 5, quindi direi che provi questo ...

#include <stdio.h>

#include <math.h>

main ()

{

char nomefunz (int num);

int num;

char *prova;

printf("numero: ");

scanf("%d",&num);

prova=nomefunz(num);

printf("%s",&prova);

}

char nomefunz (num2)

int num2;

{

char *prova2 = malloc(3*sizeof(char));

if (num2>5)

{

prova2[0]='c';

prova2[1]='i';

prova2[2]='\0';

}

else

{

prova2[0]='\0';

}

return(prova2);

}

Dipende dai vari compilatori, io ho usato solo quelli Linux (decadi fa), OS/2, Dos e Windows, ad ogni modo forse la definizione della strcpy() viene caricata da stdio.h

Non abbandonare, il C ha uno zoccolo duro iniziale impressionante, bisogna perseverare ;)

Link to comment
Share on other sites

poi non posso assolutamente abbandonare, devo fare la tesi in intelligenza artificiale, se non riesco a capire come funziona so c, sono perduto...

ma non mi scoraggio, e tengo duro

in ogni caso adesso provo le modifiche, in ogni caso ti ringrazio per tutti gli aiuti, anzi ringrazio tutti... sarò spesso su queste pagine da ora in poi...

ciao , adesso stacco e vado a lavoro, a presto

Link to comment
Share on other sites

:( allego risultati... chissà perchè non funziona...

[session started at 2007-10-18 14:27:44 +0200.]

numero: 9 <-- questo è il numero che do in ingresso

\300\377\377\377 <-- mi da questo in uscita

prova_c has exited with status 5.

[session started at 2007-10-18 14:27:54 +0200.]

numero: 2 <-- questo è il numero che do in ingresso

\300\377\377\377 <-- mi da questo in uscita

prova_c has exited with status 5.

Link to comment
Share on other sites

Intelligenza artificiale, fantastico mi piaceva un casino, ho persino usato il Prolog per popolare un dizionario in un progetto per una banca ... che tempi! ;)

Tornando al tuo problema, al momento non capisco perche' non va e non ho tempo di guardarlo, se mi ricordo questa sera magari provo su XCode a vedere cosa fa ... tu sviluppi su XCode vero?

Ciao

Link to comment
Share on other sites

C'erano tanti errori... il programma è fondamentalmente semplice, ma presenta un numero enorme di approcci possibili.

Mi sono sforzato di mantenere l'impostazione iniziale. Ecco:

#include <stdio.h>#include <math.h>#include <string.h>void nomefunz (int num, char *str);main (){int num;char prova[6];printf("numero: ");scanf("%d",&num);nomefunz(num, prova);printf(prova);}void nomefunz(int num2, char *str){if (num2>5){strcpy(str,"ciao");}else{strcpy(str,"");}}

L'errore principale è che non puoi restituire una stringa con tanta facilità da una funzione. Una stringa altro non è che un vettore, che il più delle volte non è che un puntatore... insomma la faccenda è un po' complessa.... in pratica per farlo ti devi creare un'area di memoria che contenga la stringa (in questo caso il vettore prova, composto al massimo da 6 caratteri, per "c", "i", "a", "o", e il terminatore "\0") e chiami una funzione che la manipola, dandogli un riferimento (puntatore).

È stato necessario aggiungere else perché se no con un numero minore di 5 ti avrebbe stampato una stringa a caso non terminata oppurtunamente, creando enormi casini :)

Ci sono comunque altri metodi, oltre a strcpy

Ti ricordo che nella chiamata "nomefunz(num, prova)" prova non è altro che l'indirizzo (puntatore) del primo elemento del vettore prova, di 6 caratteri..

--

EDIT:

Ah e se vuoi puoi fare piazza pulita delle graffe dopo l'if e l'else, che contengono ognuna una sola istruzione.

E poi ho cambiato

char nomefunz (num2)int num2;
perché la sintassi è obsoleta da circa un ventennio :D... ora si farebbe char nomefunz(int num2)

E... perché dici che il C non lo usa più nessuno? Mi sento vecchio.... e ho solo 17 anni... sob :(

Link to comment
Share on other sites

Per dia006, si uso xcode, ma ti ripeto, uso è un terminone, sono proprio un neofita e sto muovendo proprio i primi passi.

Invece per quanto riguarda thom..... FUNZIONA !!!!! EVVIVA!!!! Ci siamo riusciti! Anzi, ci sei riuscito!!! TI ringrazio davvero tanto, e ringrazio tutti.... Finalmente ho capito cosa devo fare... E sono proprio agli inizi, mi immagino quanti altri post sarò costretto a fare prima di laurearmi.

Per finire dicevo che non lo usa più nessuno perchè tutte le persone con cui ho parlato me lo sconsigliavano, ma ora mi rimangio le parole :)

grazie a tutti, ancora, e a presto....

ciao!!!

Link to comment
Share on other sites

ciao, sono riuscito a modificare il codice, ho trovato che funziona anche in questo modo :)

#include <stdio.h>char *prova[80]; /*la variabile dev'essere esterna*/main (){int num;char nomefunz (int num); printf("numero: ");scanf("%d",&num);nomefunz(num);printf("Allora: %s",*prova);}char nomefunz(int num2) {if (num2>5) *prova="ciao"; else  *prova="";return;}

un'ultima domanda... ma se io volessi trasformarlo in un eseguibile per mac o per windows come devo fare? esiste un modo?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share