Форум программистов, компьютерный форум CyberForum.ru

найти ошибку - C++

Восстановить пароль Регистрация
 
liana_23_
 Аватар для liana_23_
0 / 0 / 0
Регистрация: 13.10.2011
Сообщений: 138
14.10.2011, 11:58     найти ошибку #1
4)Баллов: 1
Ошибка этапа выполнения (семантическая ошибка)
Выберите по крайней мере один ответ:

пропуск ;

выход за границы массива

деление на 0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2011, 11:58     найти ошибку
Посмотрите здесь:

Найти ошибку C++
C++ Найти ошибку.
C++ Массивы. Найти среднее арифметическое элементов массива, расположенных до максимального элемента (найти ошибку в задании)
найти ошибку(в одномерном массиве найти количество различных элементов) C++
C++ В строках матрицы с отрицательным элементом на главной диагонали найти наибольший из всех элементов (найти ошибку в коде)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dzhej-Dzhej
Заблокирован
14.10.2011, 12:13     найти ошибку #2
деление на 0
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
14.10.2011, 12:51     найти ошибку #3
выход за границы массива, тоже рантайм ошибка
Dzhej-Dzhej
Заблокирован
14.10.2011, 13:13     найти ошибку #4
C++
1
2
3
4
5
6
7
8
9
#include "iostream"
 
int main()
{
    int *t = new int[3];
    std::cout << t[4];
    system("pause");
    return 0;
}
а если так?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.10.2011, 13:21     найти ошибку #5
Цитата Сообщение от Dzhej-Dzhej Посмотреть сообщение
а если так?
C++
1
2
3
4
5
6
7
8
9
#include "iostream"
 
int main()
{
    int *t = new int[3];
    t[3] = 0;
    system("pause >> NULL");
    return 0;
}
И ведь не угадаешь, что будет... UB такой UB
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
14.10.2011, 13:24     найти ошибку #6
Предполагаю, что выход за границы массива тоже будет семантической ошибкой
Dzhej-Dzhej
Заблокирован
14.10.2011, 13:38     найти ошибку #7
Здесь
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
14.10.2011, 16:48     найти ошибку #8
Разве выход за границы массива не логическая ошибка? Ведь если изменить чужую память, то ничего не произойдет, однако логика программы пострадает.
Хотя, если выйти за границы массива и попытаться освободить этот массив операций delete, то будет ошибка времени выполнения.
Dzhej-Dzhej
Заблокирован
14.10.2011, 18:49     найти ошибку #9
Цитата Сообщение от Chelioss Посмотреть сообщение
Хотя, если выйти за границы массива и попытаться освободить этот массив операций delete, то будет ошибка времени выполнения.
почему?

я так понимаю "Ошибка этапа выполнения (семантическая ошибка)" ~ "Runtime error"
когда посреди работы экзешника выпадает сообщение что "программа выполнила недопустимую операцию..." и предлагают ее завершение.

когда логическая ошибка, то программа продолжает работать(разве что ОС заглючит) но не корректно.

Цитата Сообщение от Chelioss Посмотреть сообщение
Разве выход за границы массива не логическая ошибка?
логическая
если у строки убрать завершающий ноль, тоже интересно.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.10.2011, 18:51     найти ошибку #10
Цитата Сообщение от Dzhej-Dzhej Посмотреть сообщение
если у строки убрать завершающий ноль
Ещё можно указателю присвоить случайный адрес... Так, из интереса.
Dzhej-Dzhej
14.10.2011, 19:12
  #11

Не по теме:

Цитата Сообщение от Deviaphan Посмотреть сообщение
Ещё можно указателю присвоить случайный адрес... Так, из интереса.
и записать туда что-то.

Совсем не по теме:
я когда-то себе на сях++ покер делал, "техасский безлимит", и иногда раз в десять-двадцать раздач вылетала левая карта и залипала в левом верхнем углу(а у одного игрока(~8+я) пропадала), две недели с ума сходил, пока вычислил(выход за предел диапазона, однако).

Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
14.10.2011, 19:19     найти ошибку #12
Цитата Сообщение от Dzhej-Dzhej Посмотреть сообщение
почему?
Что почему? У меня всегда была ошибка времени выполнения, когда я пытался освободить массив, при этом перед этим я выходил за границу этого массива.

Добавлено через 53 секунды
Цитата Сообщение от Dzhej-Dzhej Посмотреть сообщение
почему?

я так понимаю "Ошибка этапа выполнения (семантическая ошибка)" ~ "Runtime error"
когда посреди работы экзешника выпадает сообщение что "программа выполнила недопустимую операцию..." и предлагают ее завершение.

когда логическая ошибка, то программа продолжает работать(разве что ОС заглючит) но не корректно.


логическая
если у строки убрать завершающий ноль, тоже интересно.
Я так и не понял. Вы со мной согласились или нет?
Если выйти за предел массива, то программа работает.
Dzhej-Dzhej
14.10.2011, 19:29
  #13

Не по теме:

Цитата Сообщение от Chelioss Посмотреть сообщение
Что почему? У меня всегда была ошибка времени выполнения, когда я пытался освободить массив, при этом перед этим я выходил за границу этого массива.
здесь я спорить не буду, так как уже давно не программирую на с++ и не таким уж продвинутым я был.

может кто захочет спорить о способах реализации и особенностях IDE но не я, я сказал что думал( возможно и ошибся), и в холивар втягиваться не буду.

Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.10.2011, 19:34     найти ошибку #14
Цитата Сообщение от Dzhej-Dzhej Посмотреть сообщение
У меня всегда была ошибка времени выполнения, когда я пытался освободить массив, при этом перед этим я выходил за границу этого массива.
Только в случае выхода за нулевой элемент (-1). Выход за последний элемент чаще приводит к более поздним и более сложнообнаружимым ошибком .
Dzhej-Dzhej
14.10.2011, 20:13
  #15

Не по теме:

Цитата Сообщение от Deviaphan Посмотреть сообщение
Только в случае выхода за нулевой элемент (-1). Выход за последний элемент чаще приводит к более поздним и более сложнообнаружимым ошибком .
именно за последний
класс карта был; и массивы карт лежали рядом(перемешанная колода, что у игроков, что на столе)
и когда кликнуть на правую кромку самой правой карты получалось, например (78/*координаты клика*/*2)/78 - выдавало третий элемент в массиве из двух карт.
как-то так

Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
14.10.2011, 21:49     найти ошибку #16
Цитата Сообщение от Deviaphan Посмотреть сообщение
Только в случае выхода за нулевой элемент (-1). Выход за последний элемент чаще приводит к более поздним и более сложнообнаружимым ошибком .
Не только за нулевой. В обоих случаях выдает ошибку( Visual Studio 2008 )
В случае
C++
1
2
3
4
5
6
7
8
9
10
#include "iostream"
 
int main()
{
    int *t = new int[3];
    t[4] = 0;
    delete [] t;
    system( "pause" );
    return 0;
}
и в
C++
1
2
3
4
5
6
7
8
9
10
#include "iostream"
 
int main()
{
    int *t = new int[3];
    t[-1] = 0;
    delete []t;
    system( "pause" );
    return 0;
}
Причем если во втором случае убрать delete, то ошибки не будет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2011, 07:44     найти ошибку
Еще ссылки по теме:

C++ Найти сумму первых n-четных натуральных чисел (найти ошибку)
C++ Задача из Златопольского: "Найти числа с известным количеством делителей". Не могу найти ошибку

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
15.10.2011, 07:44     найти ошибку #17
Цитата Сообщение от Chelioss Посмотреть сообщение
В обоих случаях выдает ошибку
В релизе, в случае с динамическим массивом, не должно.
Т.е. когда -1, то затирается размер выделенной памяти, когда выходишь за последний элемент затирается случайная память, в которой может ничего и не быть. В случае с дебагом затираются флаговые значения, добавленные отладчиком для проверки выхода за границы массива.
Со статическим массивом будет порча соседних значений или порча стека.

Добавлено через 57 секунд
Цитата Сообщение от Chelioss Посмотреть сообщение
если во втором случае убрать delete
Корректность памяти проверяется не всегда, а иногда. Например, при удалении. Отключи "Buffer Secure Check" или собери в релизе.
Yandex
Объявления
15.10.2011, 07:44     найти ошибку
Ответ Создать тему
Опции темы

Текущее время: 00:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru