0

Я недавно переключился с dev C++ на windows в среду osx dev и пытаюсь использовать возвышенный текст 3. Однако, когда я запускаю свою программу, я получаю ошибку сегментации. Вот сообщение об ошибке:sublime text С ++ компиляция вызывает ошибку seg

/bin/bash: line 1: 20506 Segmentation fault: 11 "/Users/jimi/Documents/University/lab0603" 
[Finished in 1.2s with exit code 139] 
[shell_cmd: g++ "/Users/jimi/Documents/University/lab0603.cpp" -o "/Users/jimi/Documents/University/lab0603" && "/Users/jimi/Documents/University/lab0603"] 
[dir: /Users/jimi/Documents/University] 
[path: /usr/bin:/bin:/usr/sbin:/sbin] 

Вот полный код:

#include <iostream> 
#include <cmath> 

using namespace std; 


string flightDirections[16] = {"ENE", "NE", "NNE", "N", "NNW", "NW", "WNW", "W", "WSW", "SW", "SWS", "S", "SSE", "SE", "ESE", "E"}; 
double cruisingSpeed = 0; 
double windSpeed = 0; 
int windDirection = 0; 
double flightDistance = 0; 

string numberToDirection(int direction) { 

    return (direction) ? "The wind is blowing from the East." : " The wind is blowing from the West."; 

    //this way we only have one return statement :) 

} 

void getInput() { 
    cout << "Hello! \n" 
     << "Thank you for choosing to use this really great program!! \n" 
     << "This program will compute the necessary heading adjustment for your flight," 
     << " and provide the estimated flight time. \n"; 
    cout << "Enter the aircraft cruising speed in still air (in km/h): "; 
    cin >> cruisingSpeed; 
    cout << " \n \t cruising speed = " << cruisingSpeed << "\n Enter the wind speed in km/h: "; 
    cin >> windSpeed; 
    cout << " \n \t wind speed = " << windSpeed << "\n Enter 1 if the wind is blowing from the West and -1 if wind is blowing from the East:"; 
    cin >> windDirection; 
    cout << "\n\t" << numberToDirection(windDirection) << "\n Enter the distance between the originating and destination cities, in km:"; 
    cin >> flightDistance; 
    cout << "\n\t flight distance = " << flightDistance << "\n Enter the compass direction of the destination city, relative to the originating cities, using the following values:"; 
    for (int i = 0; i < sizeof(flightDirections); i++) { 
     cout << i + 1; 
     cout << flightDirections[i]; 
    } 
    cin.ignore(); 


} 

int main() { 


    getInput(); 
    return 0; 

} 

Что происходит?

+0

Что произойдет, если вы запустите эту команду вручную? – Praetorian

+0

'sizeof (flightDirections)' Что это за значение? Вы отлаживали свой код? – PaulMcKenzie

+0

@Praetorian, как бы я это сделал? спасибо –

ответ

0

Вы ошибочно используете sizeof. sizeof возвращает число байтов, а сущность содержит не число записей (для случая массива). Таким образом, это неверно:

for (int i = 0; i < sizeof(flightDirections); i++) { 

Вы должны просто использовать:

for (int i = 0; i < sizeof(flightDirections)/sizeof(flightDirections[0]); i++) { 
+0

Большое спасибо! В этом была проблема. Я привык к языкам, у которых есть более простые способы определить размеры массивов. –

2

Вы проблема с вашим цикл.

for (int i = 0; i < sizeof(flightDirections); i++) 

собирается бежать от конца массива, как sizeof(flightDirections) является терки, чем размер массива. sizeof(flightDirections) является sizeof(std::string) * number_of_elements_in_the_array. Для того, чтобы получить правильный размер массива, необходимо использовать

sizeof(flightDirections)/sizeof(flightDirections[0]) 

Или еще лучше использовать ranged based for loop в

int i = 0; 
for (const auto & e : flightDirections) { 
    cout << ++i << e; 
} 
0

sizeof дает размер в байтах, а не количество элементов массива , Когда вы звоните sizeof(flightDirections), вы, вероятно, ожидаете 16, но ризумент намного больше. Поэтому ваш цикл заходит слишком далеко, за пределами индексов вашего массива, и вы получаете неопределенное поведение - в этом случае - ошибку сегментации.

Поскольку вы имеете жестко заданный размер массива, вы можете даже жестко закодировать цикл. Или, если вы хотите иметь более гибкий код, вы можете вычислить количество элементов путем деления reuslt на SizeOf (flightDirections) размером одного элемента, например:

for (int i = 0; i < sizeof(flightDirections)/sizeof(flightDirections[0]); i++) { 

(Этот трюк является общим Практика на C, когда вам нужно передать массив функции: поскольку массив потеряет свой размер (когда он передается, он переходит в указатель), вы должны передать его явно, как второй аргумент, и это обычный способ от этого.)

0

Если вы хотите использовать sizeof(), чтобы найти длину массива, вам нужно разделить его на то, что удерживается в массиве. Смотрите этот вопрос:

How do I find the length of an array?

Вы можете использовать в зЬй :: вектор вместо этого? У этого есть метод size().

+0

Или 'std :: array'. – Biffen

+0

К сожалению, это назначение класса, и мы помечены для использования методы программирования, которых нам еще не научили –

+0

@ mc-lunar Wow. Я бы нашел другой класс. – Biffen

Смежные вопросы