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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
liana_23_
0 / 0 / 0
Регистрация: 13.10.2011
Сообщений: 138
#1

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

14.10.2011, 11:58. Просмотров 748. Ответов 16
Метки нет (Все метки)

4)Баллов: 1
Ошибка этапа выполнения (семантическая ошибка)
Выберите по крайней мере один ответ:

пропуск ;

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

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

Найти ошибку - C++
Добрый день. Есть задача с codeforces (условие). Вот моё решение: #include <iostream> #include <vector> using namespace std; ...

Найти ошибку - C++
//--------------------------------------------------------------------------- #include <clx.h> #pragma hdrstop #include...

найти ошибку - C++
Вопрос: что не так? Выводит: error C3861: time: идентификатор не найден Вот собственно программка #include <iostream> #include...

Найти ошибку - C++
При запуске программа выдает окно с ошибкой. #include <iostream> #include <vector> using namespace std; struct Stach { int N; ...

Найти ошибку - C++
Задание: написать прогу, где запрашивается рост в футах и дюймах и вес в фунтах. (Используй 3 переменные) Должен высчитываться индекс массы...

найти ошибку! - C++
вот код программы #include "stdafx.h" #include <iostream> #include <stdio.h> #include <conio.h> #include <algorithm> ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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++
1286 / 1220 / 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);
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,133
14.10.2011, 16:48     найти ошибку #8
Разве выход за границы массива не логическая ошибка? Ведь если изменить чужую память, то ничего не произойдет, однако логика программы пострадает.
Хотя, если выйти за границы массива и попытаться освободить этот массив операций delete, то будет ошибка времени выполнения.
Dzhej-Dzhej
Заблокирован
14.10.2011, 18:49     найти ошибку #9
Цитата Сообщение от Chelioss Посмотреть сообщение
Хотя, если выйти за границы массива и попытаться освободить этот массив операций delete, то будет ошибка времени выполнения.
почему?

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

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

Цитата Сообщение от Chelioss Посмотреть сообщение
Разве выход за границы массива не логическая ошибка?
логическая
если у строки убрать завершающий ноль, тоже интересно.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 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,133
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++
1286 / 1220 / 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,133
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++
При компиляции ошибок не выдаёт, но когда запускаю программу она вылетает #include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include...

Найти ошибку - C++
Из данного текста выбрать и напечатать те символы, которые встречаются в нем ровно один раз ( в том порядке, как они встречаются в тексте) ...

Найти ошибку - C++
#include &lt;vcl.h&gt; #include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #pragma hdrstop class...

Найти ошибку С++ - C++
Задание: Составить программу для вычисления элементов вектора Х по формуле: x=i*x+log(abs(x))-1, i=2,3,4...10. Выдает ошибку: error...


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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 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     найти ошибку
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru