PDA

View Full Version : [c] chiedo a voi che siete gli unici a potermi dare una risposta


Fenomeno85
18-12-2004, 20:45
Gente allora tralasciando che il compilatore non me lo compila come era ovvio aspettarselo mentre secondo il mio prof c'è qualche compilatore che lo compila ma quale compilatore riesce mai a compilare sta roba?


#include <conio.h>
#include <stdio.h>
#include <windows.h>

void main (){
char Stri[]="Prova stringa";
char *pStri;
pStri = Stri;
printf ("%s\n", pStri);
pStri = &Stri;
printf ("\n\n%s", pStri);
system("PAUSE");
}

~§~ Sempre E Solo Lei ~§~

^TiGeRShArK^
18-12-2004, 21:35
per quel poco ke ricordo di c e c++...
windows.h non l'ho mai sentito e non ho idea di quello che faccia.... penso sia collegato al comando SYSTEM ke usi perkè altrimenti non lo so proprio...
Cmq ke errore ti da? a me alcuni compilatori rompono se non faccio ritornare alla funzione main niente.
Se invece scrivo int main..... e poi gli metto un return 0; mi funziona tutto perfettamente...
X quanto riguarda il printf non mi ricordo una mazza.... oramai sono circa 8 anni ke non tocco + il c puro...
e nel c++ bastava usare il cout ....

NA01
18-12-2004, 21:54
perchè non dovrebbe compilare?
ti dovrebbe restituire un warning, ma dovrebbe compilare e funzionare perfettamente.
l'array senza parentesi quadre nonè altro che l'indirizzo del primo elemento dell'array.
la seconda volta lo rende esplicito e evita il warning, ma non cambia nulla.

il fatto che l'arraay è il suo indirizzo lo vedi già la prima volta che usi la scanf.
con %s infatti non devi dare la & in quanto il nome dell'array senza quadre è già un indirizzo.
forse può essere considerato sporco, ma concettualemnte non c'è alcun errore.

ciao

heroth
18-12-2004, 23:37
includi stdlib.h per la chiamata alla funzione system(), per il resto il codice pare plausibile. Se il compilatore ti da errore posta il messaggio, che se ne può discutere.
saluti

end.is.forever
19-12-2004, 00:17
La sintassi è corretta, manca solo la dichiarazione di system
quindi a parte quello qualsiasi compilatore decente dovrebbe compilare

Pilucchino
19-12-2004, 09:56
Il problema di compilazione è l'assegnazione seguente, se vuoi proprio farlo così magari usa un cast:
pStri = &Stri;

Certo è che il tuo professore da esercizi davvero entusiasmanti!!! :muro:

Fenomeno85
19-12-2004, 10:13
quello che fa non c'è problema system è dichiarata in windows.h, l'errore è appunto che dato che il nome dell'array è già l'inidirizzo, sussiste il problema che quando metto pStri = &Stri qui come è ovvio aspettarselo è errore infatti cerco di dare a un puntatore un doppio puntatore.
Adesso ne VC++ e ne MinGW lo compila. Quale compilatore lo compila?

~§~ Sempre E Solo Lei ~§~

Fenomeno85
19-12-2004, 10:14
Originariamente inviato da Pilucchino
Il problema di compilazione è l'assegnazione seguente, se vuoi proprio farlo così magari usa un cast:
pStri = &Stri;

Certo è che il tuo professore da esercizi davvero entusiasmanti!!! :muro:

no questo è stato un esercizio se così lo vogliamo dire perchè appunto in un suo esercizio aveva messo nel printf il %s ma con &.

~§~ Sempre E Solo Lei ~§~

Ziosilvio
19-12-2004, 14:34
Premesso che ogni compilatore C deve compilare un programma corretto scritto secondo lo standard:

#include <conio.h>
#include <stdio.h>
#include <windows.h>
conio.h e windows.h non sono standard.
E sono anche inutili in questo specifico programma.
Dovresti invece includere stdlib.h, che contiene la dichiarazione della funzione system.
void main ()
Questo è standard solo in Bullschildt (http://www.catb.org/~esr/jargon/html/B/bullschildt.html).
Il tipo di main deve essere int.

char Stri[]="Prova stringa";
Nessun problema, la memoria allocata a partire da &Stri[0] è sufficiente a contenere tutta "Prova stringa\0".

char *pStri;
pStri = Stri;
printf ("%s\n", pStri);
Nessun problema nemmeno qui, la conversione di array a puntatore è ordinaria amministrazione.

pStri = &Stri;
printf ("\n\n%s", pStri);
Qui invece potrebbe dare errore, ma non sono sicuro.
Anzi: penso proprio di no, soprattutto dopo aver letto l'intervento di NA01.

system("PAUSE");
Questo mi sembra l'ultimo punto dolente: non è detto che sul sistema esista un comando pause.

Fenomeno85
19-12-2004, 15:19
no la cosa che voglio sapere è solo questa:

pStri = &Stri

il system("PAUSE"); l'ho messo io se no non vedevo una mazza.

Cmq a me da errore e non lo compila :mbe:

~§~ Sempre E Solo Lei ~§~

SteR9
19-12-2004, 15:31
ma Fontana è un pirla :sofico:
cmq teo nemmeno devc++ lo compila..

Ziosilvio
19-12-2004, 15:36
Originariamente inviato da Fenomeno85
no la cosa che voglio sapere è solo questa:
pStri = &Stri
a me da errore e non lo compila
Uhm... ripensandoci...
Il compilatore cosa dice di preciso?
Forse rileva un tentativo di assegnare un char** a un char* senza effettuare un cast?
Prova anche a vedere la sezione 6 delle FAQ di comp.lang.c (http://www.eskimo.com/~scs/c-faq/top.html).

Fenomeno85
19-12-2004, 15:37
Originariamente inviato da SteR9
ma Fontana è un pirla :sofico:
cmq teo nemmeno devc++ lo compila..

:asd: era ovvio :asd:

cmq 3 compilatori non lo compilano

- devc++
- Visual C++
- MinGW

~§~ Sempre E Solo Lei ~§~

Pilucchino
19-12-2004, 15:45
Originariamente inviato da Fenomeno85
no la cosa che voglio sapere è solo questa:

pStri = &Stri

il system("PAUSE"); l'ho messo io se no non vedevo una mazza.

Cmq a me da errore e non lo compila :mbe:

~§~ Sempre E Solo Lei ~§~

Come ti dicevo, prova con un cast:
pStri = (char*) &Stri;

Resta il fatto che non è bello!! :oink:

anx721
19-12-2004, 15:50
MinGW lo compila, quindio anche gcc...l'importante è che dai al file estensione .c e non .cpp, altrimenti segue le regole di type checking del c++, che non ammettono cast impliciti; comunque ti da un warning:


In function `main':
warning: assignment from incompatible pointer type


Ad ogni modo cosi facendo assegni a pStri l'indirizzo di Stri, che è un array, ovvero un puntatore, quindi assegni a pStri un puntatore a un puntatore, da cui il warning, sebbene quando vai a stampare comuqnue vienne stampata la stringa normalmente stampata; il caso in cui invece non funziona (ma compila come prima) è quello in cui dichiari Stri come un char* piuttosto che come un char[]:

char *Stri2="Prova stringa";
pStri = &Stri2;
printf ("\n\n%s", pStri);

in questo caso non stampa la stringa.

ad ogni modo non capisco il senso di questi assegnamenti strani: a che scopo li fai?

Fenomeno85
19-12-2004, 15:55
Originariamente inviato da anx721
MinGW lo compila, quindio anche gcc...l'importante è che dai al file estensione .c e non .cpp, altrimenti segue le regole di type checking del c++, che non ammettono cast impliciti; comunque ti da un warning:


In function `main':
warning: assignment from incompatible pointer type


Ad ogni modo cosi facendo assegni a pStri l'indirizzo di Stri, che è un array, ovvero un puntatore, quindi assegni a pStri un puntatore a un puntatore, da cui il warning, sebbene quando vai a stampare comuqnue vienne stampata la stringa normalmente stampata; il caso in cui invece non funziona (ma compila come prima) è quello in cui dichiari Stri come un char* piuttosto che come un char[]:

char *Stri2="Prova stringa";
pStri = &Stri2;
printf ("\n\n%s", pStri);

in questo caso non stampa la stringa.

ad ogni modo non capisco il senso di questi assegnamenti strani: a che scopo li fai?

a io provavo in c++ ... va be lo scopo stendiamo un velo pietoso.

~§~ Sempre E Solo Lei ~§~

Fenomeno85
19-12-2004, 19:18
Originariamente inviato da anx721
Ad ogni modo cosi facendo assegni a pStri l'indirizzo di Stri, che è un array, ovvero un puntatore, quindi assegni a pStri un puntatore a un puntatore, da cui il warning, sebbene quando vai a stampare comuqnue vienne stampata la stringa normalmente stampata

cmq perchè stampa?

~§~ Sempre E Solo Lei ~§~

Cfranco
21-12-2004, 10:16
pStri = &Stri;
E' un errore , ben diverso ( e corretto ) sarebbe
pStri = &Stri[0];
Non é una questione di casting , é proprio un errore logico , il valore di &Stri non esiste , é come chiedere l' indirizzo di una costante numerica .

A seconda del compilatore i risultati della prima operazione possono essere vari e poco prevedibili .
In effetti Stri é un indirizzo virtuale che si riferisce all' array , non l' array stesso , nella migliore delle ipotesi l' operatore & viene ignorato e il codice funziona come
pStri = Stri
In alternativa prevedo un bel Segmentation Fault in esecuzione .

Pilucchino
21-12-2004, 10:34
Originariamente inviato da Cfranco
In effetti Stri é un indirizzo virtuale che si riferisce all' array , non l' array stesso , nella migliore delle ipotesi l' operatore & viene ignorato e il codice funziona come
pStri = Stri


Con un cast a char*, Visual C++ 6 SP5 stampa correttamente la stringa; in ogni caso concordo con te, anzi credevo che fosse chiaro nei miei post precedenti, che non è il modo corretto per eseguire l'assegnazione, ma si tratta probabilmente solo di un esercizio "mirato" (chissà cosa aveva in mente il prof. di Fenomeno85...)

Cfranco
21-12-2004, 11:55
Originariamente inviato da Fenomeno85
cmq perchè stampa?

Bella domanda .
Probabilmente il motivo va ricercato nel modo in cui sono gestiti gli array dal compilatore , dal momento che per definizione un array ha indirizzo fisso e non modificabile non viene creata nessuna variabile Stri che contiene l' indirizzo dell' array , ma viene inserito direttamente il valore dell' indirizzo .
Nel momento in cui si chiede l' indirizzo &Stri il compilatore diventa "creativo" e passa direttamente l' unico indirizzo che conosce cioé quello dell' array , cmq si tratta di un' operazione rischiosa , basta dichiarare
char * Stri="Prova stringa";
per vedere le stelle

Fenomeno85
22-12-2004, 19:05
Originariamente inviato da Pilucchino
Con un cast a char*, Visual C++ 6 SP5 stampa correttamente la stringa; in ogni caso concordo con te, anzi credevo che fosse chiaro nei miei post precedenti, che non è il modo corretto per eseguire l'assegnazione, ma si tratta probabilmente solo di un esercizio "mirato" (chissà cosa aveva in mente il prof. di Fenomeno85...)

non voglio dire il perchè di questo esercizio :rolleyes: non ci credereste.

~§~ Sempre E Solo Lei ~§~

Pilucchino
22-12-2004, 20:49
Credo che ora dircelo sia il minimo che tu debba fare... ;)

Fenomeno85
22-12-2004, 20:56
Originariamente inviato da Pilucchino
Credo che ora dircelo sia il minimo che tu debba fare... ;)

non vorrei farvi ridere più del necessario :rolleyes:

~§~ Sempre E Solo Lei ~§~

Cfranco
22-12-2004, 23:20
Originariamente inviato da Fenomeno85
non vorrei farvi ridere più del necessario :rolleyes:


Ma così stai stuzzicando la nostra curiosità :D