n° 154
Settembre 2010
Settembre 03, 2010, 04:17:49 am *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia: Usi il PC già da qualche anno? partecipa alla discussione nell'area Retrocomputing
 
   Indice   Linux Windows Internet videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


 SONDAGGIO
Saresti interessato a seguire online dei videocorsi?
Sì | No
Se sì, quali di questi argomenti sarebbero di tuo gradimento?

.NET Framework   PHP
ASP.NET Python
Attività SEO Ruby
C# Silverlight
C/C++ Visual Basic .NET
Java Windows Azure
Java per Android Windows Phone 7
Objective-C (iPhone / iPad) Altri

Attenzione! Per partecipare al sondaggio bisogna essere registrati al forum




* Messaggi recenti
Messaggi recenti
Pagine: [1] 2   Vai giù
  Stampa  
Autore Discussione: compilatore microsoft e gcc  (Letto 1994 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
attack_the_king
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 41


Mostra profilo
« inserita:: Maggio 14, 2005, 06:49:29 pm »

ciao a tutti,
qualcuno mi saprebbe spiegare perchè un prototipo del tipo

void histogram(int w, int h, int image[][w], int *hist, int grayscale);

su Linux con gcc funziona perfettamente mentre su Windows con cl dà errore per via di int image[][w]?

grazie, ciao.
Registrato
attack_the_king
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 41


Mostra profilo
« Risposta #1 inserita:: Maggio 16, 2005, 09:13:44 pm »

niente, non funziona neanche così... il problema è che, se anche avesse funzionato, il prototipo che ho scritto in prima battuta è corretto, e difatti su Linux funziona perfettamente. Il mio problema è di carattere più generale, non è solo legato a questo caso, che ho pensato di risolvere trasformando la matrice in un array, ed è: perchè il C _ANSI_ funziona su una piattaforma (Linux) con un certo compilatore (gcc) e non su un\'altra (Windows) con un altro compilatore (cl)? Mi rendo conto della stupidità della domanda, ma mi pare, e i miei studi di ingegneria lo confermano, che se ci sono degli standard sarebbe opportuno che venissero adottati, in modo che chi poi deve lavorarci lo possa fare nella massima tranquillità e semplicità... si sente parlare tanto di portabilità, ma poi quando si deve scrivere un po\' di codice che vada al di là di \"Hello world!!\" ci si imbatte sempre in mille problemi legati a cazzate di questo tipo!!
mi sbaglio??

grazie per la risposta,
ciao.
Registrato
numerone
Jr. Member
**

Karma: +0/-0
Scollegato Scollegato

Messaggi: 116


Mostra profilo
« Risposta #2 inserita:: Maggio 17, 2005, 04:14:56 am »

Posta l\'errore.
Registrato

You\'ll notice a reference to a registry key that looks curiously familiar: SOFTWARE\\Wine\\Wine\\Config. That string happens to be the first Wine-specific test Microsoft has made in a program.

Any developers from Redmond wishing to report bugs in Wine are encouraged to use our Bugzilla database.
domtes
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 24

0
Mostra profilo
« Risposta #3 inserita:: Maggio 17, 2005, 11:05:23 am »

Citazione

Il mio problema è di carattere più generale, non è solo legato a questo caso, che ho pensato di risolvere trasformando la matrice in un array, ed è: perchè il C _ANSI_ funziona su una piattaforma (Linux) con un certo compilatore (gcc) e non su un\'altra (Windows) con un altro compilatore (cl)? Mi rendo conto della stupidità della domanda, ma mi pare, e i miei studi di ingegneria lo confermano, che se ci sono degli standard sarebbe opportuno che venissero adottati, in modo che chi poi deve lavorarci lo possa fare nella massima tranquillità e semplicità... si sente parlare tanto di portabilità, ma poi quando si deve scrivere un po\' di codice che vada al di là di \"Hello world!!\" ci si imbatte sempre in mille problemi legati a cazzate di questo tipo!!


Non potrei essere più daccordo con te: se ci sono degli standard dovrebbero essere adottati...o quanto meno consultati.

Il fatto che su un compilatore qualsiasi il tuo codice funzioni è un puro caso. Infatti non è possibile dichiarare degli array dinamici senza utilizzare i puntatori, new e delete (oppure malloc e free nel C).

Quando definisci un array, accade anche se l\'array è un parametro di una funzione ad ogni chiamata, il compilatore ha bisogno di sapere, in fase di compilazione, quanta memoria allocare.

Nel tuo caso, invece, la dimensione del parametro image dovrebbe essere modulata a seconda del valore assegnato al parametro w. Non è possibile.

Se vuoi passare ad una funzione una matrice di dimensioni non note a compile-time devi modificare il tuo prototipo in questa maniera:

Codice:

void histogram(int w, int h, int *image, int *hist, int grayscale);


La responsabilità di gestire i limiti della matrice sono nelle mani del programmatore.

Se vuoi che il chiamante della funzione histogram non sia responsabile di tali dettagli ti conviene aggiungere un\'astrazione sull\'immagine, magari una classe, che gestisca automaticamente l\'allocazione della memoria e che conservi al proprio interno le informazioni sulle dimensioni e passare istanze di questa struttura dati al posto dei primi 3 parametri della tua funzione, o, meglio ancora, implementare la funzione come un membro di tale classe.

Happy Hacking!
Registrato

\"Tentare è il primo passo verso il fallimento.\"

H.J. Simpson
attack_the_king
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 41


Mostra profilo
« Risposta #4 inserita:: Maggio 17, 2005, 07:25:39 pm »

Citazione

Che poi è lo stesso di usare la dichiarazione:

void histogram(int w, int h, int image[][], int *hist, int grayscale);


Che infatti non funziona!!!!!!!!

provare per credere, compilate con cl il seguente codice:


#include

void prova(int a, int b, int c[][]);

void prova(int a, int b, int c[][]) {
   int i, j;

   for(i=0; i      for(j=0; j         printf(\"%d\\n\", c[j]);
}

int main(void) {
   int aaa[5][5];
   int i, j;

   for(i=0; i<5; i++)
      for(j=0; j<5; j++)
         aaa[j] = i+j;

   prova(5, 5, aaa);

   return 0;
}

e vedete un po\' cosa vi dice...
il risultato che ottengo io è:


dinamic.c
dinamic.c(3) : error C2087: \"c\": indice mancante
dinamic.c(5) : error C2087: \"c\": indice mancante
dinamic.c(21) : warning C4048: indici di matrice differenti: \"int (*)[1]\" e \"int [5][5]\"


riguardo a quello che ha scritto domotes, non è assolutamente vero che il fatto che con gcc compila sia un caso. infatti con il prototipo da me usato,

...(int h, int w, int image[][w],...

il compilatore non deve allocare nessuno spazio, dato che image è un puntatore. tant\'è vero che se dentro alla funzione faccio stampare sizeof(image), il risultato è quattro!!
il compilatore sa tutto quello che gli serve per poter trasformare il codice C nell\'assembly giusto: infatti, essendo le matrici mappate in memoria in maniera sequenziale riga per riga, al compilatore serve sapere da quante colonne è composta una riga, in modo da poter trasformare un codice del tipo
image[j]
nell\'equivalente assembly di
image[i*w + j]

ovviamente non c\'è nessun bound-checking, ma questo è vero in qualsiasi caso, anche con i semplici array.

ciao a tutti...
Registrato
attack_the_king
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 41


Mostra profilo
« Risposta #5 inserita:: Maggio 17, 2005, 11:19:25 pm »

a conferma di quello che ho già scritto, cioè che non è un caso che il codice da me postato compili su gcc, ho compilato il programma su VisualDSP++, un ide utilizzato per programmare i DSP della Analog, e funziona tutto perfettamente...
io ho già tratto le mie conclusioni, voi cosa ne pensate??

ciao a tutti,
daniele
Registrato
numerone
Jr. Member
**

Karma: +0/-0
Scollegato Scollegato

Messaggi: 116


Mostra profilo
« Risposta #6 inserita:: Maggio 18, 2005, 01:10:27 am »

Il C supporta il passaggio di matrici fin dalla sua specifica ANSI.
Lo standard dice che in caso di marici multidimensionali solo la prima dimensione può non essere messa.
Stando dall\'errore riportato il Visual C++ la pensa diversamente: riporta due errori di dimensioni mancanti.
Prova a specificarli.
Registrato

You\'ll notice a reference to a registry key that looks curiously familiar: SOFTWARE\\Wine\\Wine\\Config. That string happens to be the first Wine-specific test Microsoft has made in a program.

Any developers from Redmond wishing to report bugs in Wine are encouraged to use our Bugzilla database.
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +126/-3
Scollegato Scollegato

Messaggi: 2115


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #7 inserita:: Maggio 18, 2005, 09:41:19 am »

L'inusuale dichiarazione proposta è in effetti supportata dallo standard ANSI/ISO (INCITS) C 1999 in alcuni casi ben definiti, e risulta già chiara nel relativo draft pubblicamente disponibile.
Si veda in particolare l'esempio 5 a pagina 120 (corrispondente alla pagina 130 del PDF, i.e. CTRL+N "130") nella sezione 6.7.5.3 "Function declarations, including prototypes" del draft citato.

Codice:
EXAMPLE 5 - The following are all compatible function prototype declarators.
double maximum(int n, int m, double a[n][m]);
double maximum(int n, int m, double a[*][*]);
double maximum(int n, int m, double a[ ][*]);
double maximum(int n, int m, double a[ ][m]);

La specifica C'99 ha inopinatamente resuscitato, come effetto collaterale della introduzione ufficiale dei VLA (variable length array), un potente generatore di errori ed incongruenze di cui la ANSI/ISO C++ 1997 aveva tentato di liberarsi informalmente e con ampio supporto materiale (vector e derivate).

D'altro canto, parlando di DSP, chiunque conosca Numerical C dalla sua nascita sa bene che:

a) Proprio i VLA sono da sempre una delle caratteristiche salienti delle estensioni introdotte da GCC (da cui deriva appunto Numerical C) !

b) Lo standard C'99 ha accolto la quasi totalità dei nuovi costrutti GNU/Numerical C (numeri complessi, nuova sintassi per gli array, VLA etc.).

c) Una parte consistente del manuale del compilatore VisualDSP++ (come quelli della quasi totalità di cross-compilatori embedded) è dedicata a descrivere le innumerevoli estensioni e variazioni rispetto allo standard ANSI/ISO C++ 1997, tra le quali ve ne sono alcune specifiche per inizializzatori non costanti e per la compatibilità esplicita con GCC.

Queste osservazioni storiche spiegano perfettamente l'ampio supporto dei compilatori GCC a quei costrutti alquanto inusuali: la loro introduzione come features proprietarie si deve proprio a tali compilatori.
Il recepimento nello standard è avvenuto molti anni dopo.

Detto questo, si deve comunque ricordare che nell'antecedente standard ANSI/ISO 1997 relativo a C++ (un draft recente è pubblicamente disponibile qui) non si fa minimamente menzione di tale forma.

A fortiori, riassumendo lo Stroustrup(1) che di tale standard è l'ispiratore, il padre e l'artefice:
Le espressioni sintatticamente valide in C++ per una dichiarazione di funzione che impieghi array old style con subscritti espliciti con singola omissione sono
Codice:
    fn(array[])
e
    fn(array[][B]..[Z])
nella seconda forma B..Z sono tutte COSTANTI NOTE A TEMPO DI COMPILAZIONE, ossia combinazioni arbitrarie di una o più delle seguenti tipologie:
- Costanti numeriche intere esplicite;
- Costanti simboliche dichiarate tramite const (unsigned) int o idiomi equivalenti;
- Interi positivi (naturali non nulli) dichiarati indirettamente tramite #define (pessima pratica di programmazione, ma formalmente corretta).
Riguardo al range ammissibile, le costanti di cui sopra saranno obbligatoriamente tutte risolvibili a compile time come interi positivi.
Si veda anche questo esempio, che fa appunto uso di const.

Il metodo formalmente consigliato dal creatore del linguaggio C++ per l'impiego di array dinamici come parametri, unico metodo ufficialmente previsto in C++ '97, è il passaggio del puntatore accompagnato da un int per ogni dimensione dell'array.

Come noto, il nome stesso dell'array è un puntatore implicito dal contenuto costante, in quanto coincide funzionalmente quasi ovunque con il puntatore al primo elemento dell'array, con restrizioni solo sull'uso come Lvalue. Si tratta inoltre dell'unico tipo di dato predefinito per il quale, dato un array A, l'espressione logica (A == &A) venga valutata come TRUE. La scrittura &A è formalmente corretta, sebbene del tutto priva di effetto ed equivalente al semplice nome dell'array.
 
Bjarne specifica inoltre che, se si vuole realmente impiegare C++ come OOL "moderno", robusto, portabile, manutenibile, nei limiti consentiti dal linguaggio (alla fin dei conti non si parla di Eiffel o Smalltalk), è ampiamente preferibile dimenticarsi gli array C-style ed impiegare direttamente vector, valarray, list, string.

Gli array multidimensionali C-style sono effettivamente considerati legacy per C++, nello Stroustrup ed in quasi tutta la letteratura subordinata e derivata, inclusi gli standard interni per la codifica derivati da raccomandazioni normative della massima autorevolezza come DO178A/B, D6-35071, ESA PSS05, MISRA/C++ e simili.

Nessuna meraviglia, quindi, che alcuni compilatori C/C++ anche molto recenti possano richiedere l'uso di switch e/o direttive #pragma per supportare appieno una sintassi di fatto peculiare del C'99, o magari scegliere di non supportarla affatto, vista la presenza di alternative stilisticamente più pulite e meno error-prone in C++.

In definitiva, un simile stile di dichiarazione è effettivamente standard per il C'99, ma non lo è per C++ '97 né per il "classico" C'89.


(1) "The C++ Programming language, 3rd ed.", Addison Wesley 1997, pag. 838 e seguenti.
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io?
numerone
Jr. Member
**

Karma: +0/-0
Scollegato Scollegato

Messaggi: 116


Mostra profilo
« Risposta #8 inserita:: Maggio 18, 2005, 05:17:20 pm »

Citazione
In definitiva, un simile stile di dichiarazione è effettivamente standard per il C\'99, ma non lo è per C++ né per il \"classico\" ANSI C\'89.


A me risultava diversamente, sempre parlando di C non di C++, in ogni caso grazie per il chiarimento.
Se allora il compilatore é visual c++ 6.0 il mistero é risolto, in quanto é antecedente al C99.
Registrato

You\'ll notice a reference to a registry key that looks curiously familiar: SOFTWARE\\Wine\\Wine\\Config. That string happens to be the first Wine-specific test Microsoft has made in a program.

Any developers from Redmond wishing to report bugs in Wine are encouraged to use our Bugzilla database.
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +126/-3
Scollegato Scollegato

Messaggi: 2115


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #9 inserita:: Maggio 18, 2005, 10:39:16 pm »

Citazione
Postato originariamente da johnkoenig
Infine, se provi a compilare con Visual Studio .NET 2003 o con la beta di Visual Studio 2005, potrai notare che non cambia assolutamente nulla...


Non conosco VC, ma presumo che, dato che il nuovo stile di dichiarazione confligge apertamente con i controlli sintattici standard di C++, si debba in qualche modo dire esplicitamente al compilatore di accettare quella scrittura quando sta compilando codice C. E\' solo un\'ipotesi, ma tu puoi agevolmente verificarla compulsando i manuali.
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io?
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +126/-3
Scollegato Scollegato

Messaggi: 2115


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #10 inserita:: Maggio 19, 2005, 01:28:14 am »

Citazione
Postato originariamente da numerone
Grazie per il chiarimento.


Per maggiore chiarezza illustrativa, ho aggiunto l\'esempio specifico dal draft ANSI C 1999 a cui facciamo riferimento.

E\' opportuno aggiungere che, al di là di una ragionieristica e pedissequa consultazione degli standard, la sintassi proposta è poco elegante e totalmente desueta: non solo sintatticamente sbagliata in C++ ma decisamente poco usata anche tra i programmatori C più maturi, in ambito embedded e non.

Parlando di C, l\'impiego esplicito dei puntatori è ampiamente preferito, consente la backward compatibility con decine di compilatori lagacy, mantiene l\'analogia concettuale con le pratiche utilizzate in Assembly, e concorre ugualmente al buon uso di tecniche superiori per la robustezza del codice come le assert() ed il DBC.
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io?
Hyde
Global Moderator
Hero Member
*****

Karma: +43/-6
Scollegato Scollegato

Messaggi: 3192


I am a man who walks alone


Mostra profilo WWW
« Risposta #11 inserita:: Giugno 13, 2005, 06:17:58 pm »

Thread soggetto a taglia&cuci obbligato. Era veramente un peccato vedere questo thread rovinato dagli ultimi 4 interventi!!

--------------------
Per coloro che leggessero il thread solo dopo il riedit:
i post tagliati non contenevano informazioni pertinenti con l\'argomento della discussione
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.
http://mrhyde.altervista.org
Aj86
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 20


Mostra profilo
« Risposta #12 inserita:: Giugno 19, 2005, 02:23:52 pm »

Ciao a tutti, scusate se mi intrometto, avrei bisogno di un chiarimento:
da quello che ho capito, per programmare a un livello decente in C++ (oop) mi dovrei dimenticare completamente gli array ed usare vector, mentre in C quando passo array dovrei usare solo puntatori, come ad esempio
Codice:
double faiQualcosa(int dim1, int dim2, double **arr)
dove dim1 e dim2 sono le dimensioni dell\'array, o non ci ho capito niente?
Grazie della pazienza,
Ciao

Fabio
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +126/-3
Scollegato Scollegato

Messaggi: 2115


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #13 inserita:: Giugno 19, 2005, 05:50:23 pm »

Citazione
Postato originariamente da Aj86
da quello che ho capito, per programmare a un livello decente in C++ (oop) mi dovrei dimenticare completamente gli array ed usare vector, mentre in C quando passo array dovrei usare solo puntatori


Assolutamente corretto. Così consigliano i Testi Sacri, e nella mia esperienza lo confermano svariati milioni di linee di codice professionalmente disponibili in librerie, frameworks, applicazioni prodotte negli ultimi 15/20 anni.

Naturalmente ciò che vale in C (C89, repetita juvant) vale anche in C++ laddove vi sia effettiva necessità, ad esempio nella programmazione system-level, di manipolare determinate aree di memoria come array: si usano i puntatori nelle funzioni subordinate.

BTW nel tuo esempio c\'è un asterisco di troppo, a meno che tu non intenda esplicitamente utilizzare un array di puntatori a double.
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io?
Aj86
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 20


Mostra profilo
« Risposta #14 inserita:: Giugno 19, 2005, 07:45:58 pm »

Il mio intento era quello di passare un array bidimensionale di double... Ora, è un po\' che non prgrammo in C++ ma mi sembra che si possa fare in questo modo, in modo da potervi accedere anche tramite una sintassi tipo arr
  • [y]..
Registrato
Pagine: [1] 2   Vai su
  Stampa  
 
Vai a:  

Copyright © 2009 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page