Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Koodin osan paikan vaihto

Ripe [06.03.2013 20:29:14]

#

Tuli kummallinen ongelma. Kun vaihdan "ensimmäisen" ja "toisen osan" (koodissa kommentoituina) paikkaa niin, että "toinen osa" on ensin, "ensimmäistä osaa" ei koskaan edes testata, vaikka "toisen osan" if-lauseeseen ei mennä, eli ehto ei toteudu. Ohjelma ei myöskään tulosta lopussa tulostettavaa tekstiä. Kun ensimmäinen osa on ensin, ohjelma toimii oikein.

int main(int argc, char **argv){
	string line;
	vector<string> v;
	ifstream file;

	cout << argc << endl;
	if (argc < 2){ // Ensimmäinen osa
		cout << "No file specified" << endl;
		return 0;
	}
	if (strcmp(argv[1], "-h") == 0){ // Toinen osa
		cout << "Usage: main <filename>" << endl;
		return 0;
	}

	file.open(argv[1]);
    if (file.is_open()){
        // Koodia
    else cout << "Unable to open file" << endl;
}

Sisuaski [06.03.2013 20:33:30]

#

Ohjelma kaatunee jos siirrät toisen osan ennen ensimmäistä, koska argv[1] sisältää null-osoittimen jos ohjelmalle ei ole annettu yhtään parametria ja strcmp vaatii että kumpikin parametri on kunnollinen merkkijono.

Ripe [06.03.2013 20:38:35]

#

Kiitos vastauksesta. Miten sen voisi saada toimimaan niin, ettei se kaadu tuossa tapauksessa? Kummastelen vain, että miksei voi vaihdella koodiblokkien paikkoja niin, ettei ohjelma kaadu.

Metabolix [06.03.2013 21:14:44]

#

Ripe kirjoitti:

Kummastelen vain, että miksei voi vaihdella koodiblokkien paikkoja niin, ettei ohjelma kaadu.

Ihan samasta syystä kuin ei voi ensin myydä autoaan ja sitten lähteä ajamaan sillä. Jos parametria ei ole, sitä ei voi verrata tekstiin "-h".

En ymmärrä, miksi edes haluaisit vaihtaa noiden paikkaa. Vaikka koodi tuurilla toimisikin, toiminta olisi täsmälleen sama: jos parametri "-h" on annettu, parametrien määrän tarkistava ehto ei voi toteutua.

Tietenkin koodin järjestyksen muuttaminen (näennäisesti) on mahdollista, kunhan tarkistat ennen tekstin vertailua, että parametrien määrä on riittävä:

if (argc >= 2 && strcmp(argv[1], "-h") == 0) { /* ... */ }
if (argc < 2) { /* ... */ }

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta