Kezdőoldal » Számítástechnika » Programozás » Hiba nélkül lefordítja, de...

Hiba nélkül lefordítja, de már nem futtatja? (C++)

Figyelt kérdés

A program nagyon egyszerű, csak két sorozatot szeretnék megadni, de a futtatást már nem éri meg, "main.exe működése leállt"-ot ír ki a képernyőre. Debugging-ra pedig azt írja ki, hogy "Program received signal SIGSEGV, Segmentation fault"


#include <iostream>


using namespace std;


int main()

{

//bekérés

int n,m;

int v1[n];

int v2[m];


//1. sorozat

do{

cout << "Kerem az 1. sorozat elemeinek szamat: ";

cin >> n;}

while(n<=0);


for(int i=0;i<n;i++){

cout << i+1 << ". elem: ";

cin >> v1[i];

}


//2. sorozat

do{

cout << "Kerem a 2. sorozat elemeinek szamat: ";

cin >> m;}

while(m<=0);


for(int i=0;i<m;i++){

cout << i+1 << ". elem: ";

cin >> v2[m];

}


return 0;

}


Köszi a segítséget!



2016. nov. 6. 12:21
1 2
 1/11 anonim ***** válasza:
Létrehozol két memóriaszemét méretű tömböt, ami lehet 0 vagy, akár negatív is.
2016. nov. 6. 12:28
Hasznos számodra ez a válasz?
 2/11 A kérdező kommentje:
Tehát a két tömb deklarálását elég lett volna a a ciklusok közé berakni. Köszi!
2016. nov. 6. 12:32
 3/11 anonim ***** válasza:

int n,m;

int v1[n];

int v2[m];


Ez a definíció annyira rossz, hogy csoda, hogy egyáltalán sikerült lefordítani. Kap az n és az m valami kezdőértéket, ami jó esetben nulla, rossz esetben teljesen random, ami épp a memóriában ott van. Aztán ezzel definiálsz tömb méretet. Aztán ebbe a potenciálisan nulla méretű tömbbe elkezdesz adatokat írni. Csoda, hogy összeomlik a program?

2016. nov. 6. 12:32
Hasznos számodra ez a válasz?
 4/11 A kérdező kommentje:
Nagyon hasznosak ezek a részletes leírások, mert így fogom megtanulni hogy mikor szabad deklarálni a tömböket, viszont ezt le lehet úgy is írni, hogy nem érződik minden mondatból, hogy tiszta hülye vagyok. :) Ezek nélkül is megértem. Köszönöm!
2016. nov. 6. 12:38
 5/11 anonim ***** válasza:
Itt inkább a gcc a hülye, hogy ezt hagyja átmenni.
2016. nov. 6. 12:44
Hasznos számodra ez a válasz?
 6/11 anonim ***** válasza:
Csak akkor deklarálhatsz tömböt ha tudod előre a mértét és azt konstanssal meg tudod adni. Minden egyéb esetben new[] operátorral kell létrehoznod.
2016. nov. 6. 12:49
Hasznos számodra ez a válasz?
 7/11 SimkoL ***** válasza:
#6: és akkor mi van a dinamikus tömbökkel ?
2016. nov. 6. 13:01
Hasznos számodra ez a válasz?
 8/11 anonim ***** válasza:
#7 Dinamikus tömbök soha nem voltak C++-ban. C99-be kerültek be VLA néven de egyből ki is szedték mert rossz volt a koncepció. Az már másik kérdés hogy bizonyos fordítók nem szólnak érte és megoldják. Ha dinamikus méretű tömb kell akkor használjon a kérdező vectort vagy más kollekciót.
2016. nov. 6. 13:20
Hasznos számodra ez a válasz?
 9/11 anonim ***** válasza:

#7 Dinamikus tömb, mint olyan, nincs a nyelvben. Legfeljebb olyan adatszerkezetet lehet létrehozni, ami kívülről dinamikus, de a belső szerkezete akkor is a konstans méretű tömbökre építkezik. (Persze most tömbökről, és társairól beszélünk, a listaszerkezet más téma)


#5 A GCC nem hülye, csak a standard nem tiltja ezt a működést, ezért nem utasítja el. Alighanem dob rá viszont warningot, csak a kérdező -Wall -Wextra flagek nélkül fordít.

2016. nov. 6. 15:17
Hasznos számodra ez a válasz?
 10/11 anonim ***** válasza:

Megfelelő flagekkel minden fordító ír rá valami hasonlót:


main.cpp:41: warning: variable length arrays are a C99 feature [-Wvla-extension]

int v1[n];

^


Az esetek nagyrészében ha fordításnál ismert a tömbméret akkor std::array, amúgy std::vector

2016. nov. 6. 15:31
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!