Newsgroup: it.comp.lang.c++
Titolo: progr. senza errori che non viene eseguito

ciao a tutti,
il listato seguente non contiene errori (a quanto dice il compliatore...)
tuttavia il tasto "Execute" non è attivo...come mai???
Il programma chiede all'utente di inserire 3 elementi in un vettore, li
passa alla funzione min che "dovrebbe" trovare il minimo fra i tre...ecco il
codice:
#include <stdio.h>
#include <iostream>
void min (int vet);
int vet[3];
int main(int argc, char *argv[])
{
  int I;
  //Caricamento dell'Array
  for (I=0; I<3; ++I)
  {
  cout << "inserire vet["<<I<<"]";
  cin >> vet[I];
  }
  // Visualizzazione dell'array
  for (I=0; I<3; ++I) cout << vet[I]<<"\n";
  min(vet[I]);//calcola il minimo
  return 0;
}
  void min (int minimo, int I)
  {
  for (I=0; I<3;++I)
  {
   minimo==vet[I];
   if (vet[I+1]< minimo)
   (minimo==vet[I+1]);
  }
   cout<< minimo;
  }

    (minimo==vet[I+1]);
che sono sintatticamente validi ma logicamente sbagliati.
Comunque, che ne diresti di usare qualche idioma C++ (visto che il
programma e' in C++); tipo:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
int main() {
  vector<int> vi;
  copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(vi));
  vector<int>::iterator it = min_element(vi.begin(), vi.end());
  cout << "I valori immessi sono: ";
  copy(vi.begin(), vi.end(), ostream_iterator<int>(cout, " "));
  cout << '\n' << "ed il piu' piccolo di quei valori e' " << *it << endl;
  return 0;
}
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy          loreti at pd dot infn dot it

 programma e' in C++);
xchè ho appena iniziato a studiare il C++ all'università...e abbiamo appena
introdotto le funzioni....quelle intestazioni che hai inserito non so
neanche cosa siano! :-((
ciao

 ...
Questo e' uno dei meno chiari algoritmi che abbia mai visto.  Il fatto
che il solito numero magico 3 sia inchiavardato all'interno e' ancora
un abominio.  E la scelta di stampare all'interno e' quanto meno
opinabile.  Manca qualunque pensiero rivolto alla const correctness.
Inoltre, visto che il problema e' generale, perche' non programmare
genericamente per trovare il minimo valore di un array di lunghezza
qualunque di ADT qualunque, per cui sia definito operator< ?  Per
finire, eccoti il compito svolto:
#include <iostream>
using namespace std;
template <typename T> const T & trovaMin(
  const T *    tArray,
  const size_t N
) {
// Restituisce in  uscita il piu' piccolo degli N valori
// tArray[0]...tArray[N-1].  Richiede che sia definito
// operator < per il tipo T.
  size_t indice = 0;
  for (size_t i = 1;   i < N;   ++i) {
    if (tArray[i] < tArray[indice]) indice = i;
  }
  return *(tArray + indice);
}
int main() {
  const size_t dimensione = 3;
  size_t i;
  int vet[dimensione];
  // Caricamento dell'array
  cout << "Scrivi " << dimensione
       << " interi separati da spazi, per favore:\n";
  for (i = 0;  i < dimensione;  ++i) cin >> vet[i];
  // Visualizzazione dell'array
  cout << "Grazie.\nI numeri introdotti sono:";
  for (i = 0;  i < dimensione;  ++i) cout << ' ' << vet[i];
  // Stampa il minimo
  cout << "; il piu' piccolo tra loro e' "
       << trovaMin(vet, dimensione) << ".\n";


 [snippete] oppure un const int, o ancora meglio un const size_t.
per favore, sai spiegarmi qual'č la differenza tra i due?
non l'ho chiara, in che senso č meglio il const size_t?
--
Lupin85©
Azzurranet IRC: @#afiad, @#fils, @#pokegalaxy - ICQ: 91528290
Mail: Remove PAN to contact me
- "It is not important what you believe, only that you believe." -

 non l'ho chiara, in che senso č meglio il const size_t?
std::size_t e' un tipo intero senza segno dipendente dalla piattaforma, 
adatto a rappresentare dimensioni di entita' rappresentate in memoria. 
Il suo utilizzo al posto di int rende il codice piu' portabile.
Ciao,
Nicola


In generale puoi migliorare alcuni aspetti, ad esempio non dichiarare
l'array come globale perchè cmq in una funzione lo passi per riferimento,
quindi riesci comunque ad accedervi; inoltre passalo come const visto che
non devi modificarlo così applichi il principio del minor privilegio...
spesso nel newsgroup tendono a bocciarti tutto perchè usano le librerie di
sistema, io so quanto te che non è quello che ci viene richiesto ai nostri
fini didattici quindi lascia perdere chi ti chiede perchè non usi le
librerie e cerca invece di migliorare questo sorgente che hai fatto.
Gabriele

 per favore, sai spiegarmi qual'č la differenza tra i due?
Un size_t e' un tipo aritmetico unsigned implementation defined.  E'
garantito che un size_t sia capace di ospitare il valore ritornato da
un qualunque costrutto che riguardi le dimensioni di un array (ad
esempio sizeof, strlen, ...).  Per questo motivo e' implicito che gli
indici di un array possano sicuramente essere rappresentati da un
size_t.
Normalmente un size_t e' typedef-inito come un unsigned long; se tu
usassi invece int o unsigned int, ci sarebbero dei valori leciti per
l'indice che non sarebbero rappresentabili.


 Gabriele
finalmente qualcuno che la pensa come me!!! Thanks!!!
ciao
maurizio

 finalmente qualcuno che la pensa come me!!! Thanks!!!
 
e' buona pratica ascoltare chi non la pensa come noi, perche' da chi e' 
d'accordo non si impara nulla, mentre da chi la vede diversamente c'e' 
sempre da imparare, fosse anche solo dai suoi errori.

 sempre da imparare, fosse anche solo dai suoi errori.
Anche su questo sono pienamente d'accordo, anzi mi giungono voci che nel
mondo lavorativo i giovani pecchino di mancanza di umiltà; io sono ancora
uno studente, tra le altre cose pure alle prime armi, e se fossi uno che non
crede a tali cose, probabilmente neanche ti avrei scritto più volte che hai
ragione :o)
Gabriele

 in modo migliore perchè siamo tutti d'accordo su questo; 
non intendevo questo. il discorso e' che se ti insegnano il C 
spacciandolo per C++, la cosa puo' solo che deprimere. 

spacciandolo per C++, la cosa puo' solo che deprimere. 
Personalmente trovo spaventosa l'idea che si insegni
ad un malcapitato ad usare gli algoritmi di STL
quando questo ancora ha problemi a comprendere i
cicli in genereale e la sintasi del for.
Anche la scelta di insegnare a programmare partendo
dal C++, seppure discutibile, non la trovo impossibile
da percorrere... anche se secondo me in questo caso
e' assolutamente d'obbligo mettere a posto prima la
programmazione strutturata dei concetti di OOP o
della programmazione generica.
Gli esseri umani tendono a trovare pou' semplice
imparare partendo dal concreto e andando verso
l'astratto... insegnare una cosa enorme come il C++
partendo "dall'alto" e' secondo me una follia.
Riguardo agli algoritmi poi io sono personalmente
titubante... nel C++ la sintassi nei casi reali
e' abbastanza orribile (complice la mancanza di
closures) e porta ad un microfrazionamento dei
concetti (causa l'obbligatorieta' di definire ogni
singolo pezzo separatamente e lontano dal contesto
di uso dell'algoritmo).
Andrea

 non devi modificarlo così applichi il principio del minor privilegio...
fatto! come faccio a stampare il risultato non dalla funzione min ma dalla
main???
Ecco il codice attuale:
#include "stdio.h"
#include <iostream>
void min (int vet[]);
const int n=3;
int main(int argc, char *argv[])
{
  int I;
  int vet[n];
  //Caricamento dell'Array
  for (I=0; I<n; I++)
  {
  cout << "Inserire vet["<<I<<"]: ";
  cin >> vet[I];
  }
  // Visualizzazione dell'array
  cout<<"\nVisualizzazione Vettore:\n\n";
  for (I=0; I<n; I++) cout << "["<< vet[I]<<"] "<<" ";
  cout<<"\n";
  min(vet);//calcola il minimo
  return 0;
}
void min (int vet[])
{
  int minimo;
  int I;
  minimo=vet[0];
  for (I=0; I<n;I++)
    {
      if (vet[I]< minimo)
      (minimo=vet[I]);
    }
  cout<< "\nIl minimo e': "<< minimo;//visualizza il minimo
  getchar();
}

 }
tutto chiaro?
--
Gerolamo

 di uso dell'algoritmo).
per me, io farei prima un corso di analisi di progetti, anche a livello 
elementare, per poi passare al C++ vero e proprio
 


ciao
maurizio

 tutto chiaro?
Non credo.  Le stesse cose glie le avevo gia' dette io (con in piu'
qualche parolina sulle variabili globali, la const correctness e via
dicendo - soprattutto che chamare una procedura "min" invoca undefined
behaviour.  Ma lui ha preferito ignorare tutto.  Bella maniera di
chiedere aiuti, quella di non dar retta alle risposte!  Insisto
comunque che questo non e' C++ neanche da lontano.  Rinnovo l'invito a
leggere le seguenti righe, gia' postate:
,-----
| #include <algorithm>
| #include <iostream>
| #include <iterator>
| #include <vector>
| 
| using namespace std;
| 
| int main() {
|   vector<int> vi;
| 
|   copy(istream_iterator<int>(cin), istream_iterator<int>(),
|        back_inserter(vi));
|   vector<int>::iterator it = min_element(vi.begin(), vi.end());
|   cout << "I valori immessi sono: ";
|   copy(vi.begin(), vi.end(), ostream_iterator<int>(cout, " "));
|   cout << '\n' << "ed il piu' piccolo dei valori e' "
|        << *it << endl;
| }
`-----
Il C++ e' un linguaggio potente.  Una linea per l'input; una per
risolvere il problema; una linea per la stampa dei risultati.  La
garanzia che introducendo un milione di numeri funziona sempre tutto.
A che scopo usare una Ferrari se non si mette mai una marcia sopra la
prima?  D'accordo, lui e' ancora alla quinta pagina dello Stroustrup;
ma allora perche' non ha letto/capito quando gli ho gia' dato tutti i
suggerimenti che tu oggi gli hai voluto ripetere, piu' qualcos'altro?
PLONK


 dalla main???
Posso suggerirti caldamente di seguire alcuni consigli che ti sono già 
stati dati all'inizio?
Capisco le difficoltà, ma stai farcendo il programma di errori ameni quando 
potresti risolvere il problema con tre righe di codice in modo assai più 
C++mode/sicuro/elegante/potente. 
Senza contare che stai ignorando completamente alcuni suggerimenti che ti 
sono stati ripetuti più di una volta, come ad esempio il fatto che chiamare 
una funzione con un nome riservato (min) ha un comportamento indefinito 
(forse non hai capito, ma gli devi cambiar nome!). 
Aggiungo un suggerimento: se posti un pezzo di codice su cui vuoi 
suggerimenti implemetativi, *prima* fai in modo che sia almeno compilabile. 
E' inutile che chiedi "come fare a stampare il risultato dalla main" se 
quel programma non si compila nemmeno. 
-- 
---
In silenzio anche un idiota sembra intelligente. Ma non c'è problema,
l'idiota vuol sempre dire la sua.

 chiamare una funzione con un nome riservato (min) ha un
Posso certamente sbagliare, però non mi risulta che min sia un
nome riservato in C++.
Ciao.
--
BSD is for UNIX-lovers -- linux is for Windows-haters.

PLONK
Mi sa che mi sono perso qualche puntata... la cosa
sembra tesa...
Andrea

 Parentesi tonda?  Il compilatore non dice nulla?
no, dovrebbe essere sintatticamente corretto: le parentesi sono 
ridondanti ed il codice equivale a
if (vet[I]< minimo)
    minimo=vet[I];
ciao Anto
-- 
"Computer science is not about computers any more than astronomy
is about telescopes." -- EW Dijkstra

 no, dovrebbe essere sintatticamente corretto: 
Lo è senza dubbio. Le parentesi possono essere inutili (se non cambiano 
l'ordine di valutazione nell'espressione) ma una volta che sono aperte e 
chiuse correttamente...
A volte possono essere usate solo per variare la leggibilità del codice 
(migliorarla o peggiorarla, dipende dai casi) magari in espressioni 
complesse. 


 ordinamento mi serve e tutta la magia e' sparita.
Al proposito ti suggerisco di dare un'occhiata a librerie come la Boost 
Lambda Library (
www.boost.org
) o Phoenix, che e' parte di Spirit 
(
spirit.sourceforge.net
).
Ciao,
Nicola

 nome riservato in C++.
Riservato no, ma e' il nome di una funzione template della libreria 
standard.
Ciao,
Nicola

 libreria standard.
Quindi nessun comportamento indefinito nel chiamare una funzione
min. D'altra parte i namespace servono proprio a questo.


 min. D'altra parte i namespace servono proprio a questo.
Anche il buon senso.
Ciao,
Nicola

 alternativo"???
a parte che il 'metodo alternativo' è ripetuto settimanalmente
(se non più spesso) su questo NG, quel che mi chiedo io è:
Ma sono tutti presi dalla mania del doppio click da queste parti?
Nessuno che usii il caro vecchio prompt di comandi???
Esegui -> cmd -> 'cd directory\del\programma\eseguibile\' ->
-> 'nome_eseguibile.exe'
e garantisco che la finestra rimane aperta :-))
--
Gerolamo

 leggere le seguenti righe, gia' postate:
Perfettamente d'accordo col tuo codice.
Ma il problema è che le sovrastrutture del C++ sono comode,
ma, IMHO, necessitano l'aver compreso quel che ci sta sotto.
Fino a quel punto non credo valga la pena utilizzarle.
Se si vuole utilizzare a tutti i costi qualcosa di alto livello,
tantovale cambiare linguaggio e prenderne direttamente uno
più facile.
Una volta che la comprensione del C++ è a un livello discreto,
invece, la tua risposta mi pare ineccepibile.
p.s.
min() è un algoritmo standard, ma sta nel namespace std::
per cui non vedo il problema a definire una ::min()...
-- 
Gerolamo

 per cui non vedo il problema a definire una ::min()...
Perche' correre rischi inutili? Per esempio sotto Windows min e max sono 
macro...
Ciao,
Nicola

 a char, converrebbe partire con vettori, iteratori ed algoritmi.
Io credo che siano due aspetti diversi, che devono essere entrambi 
assimilati. Certo non si può fare a meno di conoscere l'aritmetica dei 
puntatori, ma neanche ignorare volutamente l'esistenza della stl a scopo 
didattico. Molti concetti prescindono. 


 didattico. Molti concetti prescindono.
Scusate se intervengo, da learner, nella vostra discussione, ma vorrei dire
che un newbie "intermedio" come me, che già conosca, magari
superficialmente,
l'STL, trova vantaggi anche in un corso che ignora l'STL.
Infatti il libro che sto seguendo parte da zero, e lo seguo passo per passo
sebbene molti concetti io li abbia già assimilati. Ho deciso di imparare in
maniera più sistematica.
Solo che, arrivati agli esercizi, io uso, dove non può essere considerato
"barare", l'STL. Ad esempio utilizzo vettori e stringhe in un programma che
richiede di trovare il numero di occorrenze di parole di lunghezza n.
L'approccio STL a concetti come la stringa ed il vettore è molto più
efficiente
e pratico del classico approccio C: non vedo il motivo di non sfruttarlo.
Forse l'idea di Nicola, di partire da vettori e std::string è positiva: è
vero che io uso entrambi praticamente dall'inizio della mia avventura con il
C++, ma è anche vero che sto iniziando a capire cosa ci sta dietro solo ora
che approfondisco la mia conoscenza del linguaggio.
--
Lupin85©
Azzurranet IRC: @#afiad, @#fils, @#pokegalaxy - ICQ: 91528290
Mail: Remove PAN to contact me
- "It is not important what you believe, only that you believe." -

(
spirit.sourceforge.net
).
Avevo gia' visto la lambda di boost qualche tempo fa...
il tentativo e' lodevole ma onestamente mi viene sempre
il solito dubbio che si voglia scavare delle fondamenta
usando un cucchiaino da caffe', forse per qualche strana
forma di "il mondo vedra' che e' possibile!!".
Le soluzioni che si ottengono sono anche carine da un
punto di vista puramente formale... ma sempre con un
sacco di limiti e asimmetrie e stranezze sintattiche e
work-around e problemi di portabilita'/pesantezza:
quando si e' superata la fase del "Wow!... non pensavo
che il C++ permettesse di fare queste cose" si arriva
pero' a capire che comunque sono accrocchi rispetto a
quelli che ad esempio Clipper 5 chiamava "code blocks".
E comunque se proprio si vuole spingere sulla strada
di <algorithm> (su cui io conservo qualche dubbio)
si facciano almeno esempi che usano la BLL o phoenix
che non conosco invece degli algoritmi "nudi e crudi"
della libreria standard che risultano spaventosi da
usare non appena si abbandonano i simpatici esempietti.
Io credo che sarebbe una aggiunta interessante al
C++ la possibilita' di specificare codice in-line con
accesso alle risorse locali da passare come argomento
ad una funzione... pero' solo se fatta bene e
integrata con il linguaggio.
Andrea

 sono macro...
beh, si parlava di standard...
Ma in effetti sono io il primo ad usare nomi come
calcola_il_minimo_di_un_array_di_tre_interi();
:-))
--
Gerolamo

 Anche il buon senso.
Sģ, sģ, certamente non metto in dubbio che il nome scelto non
sia dei migliori, perņ trovavo strano il "comportamento
indefinito".


 :-))
Come, non usi std::min_element? Se ti becca il prof. Loreti... :-)
Ciao,
Nicola

 Come, non usi std::min_element? Se ti becca il prof. Loreti... :-)
azz! :-))))))
--
Gerolamo