Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Kontaktnik
2 / 2 / 2
Регистрация: 22.08.2012
Сообщений: 24
1

Ошибка сегментиования

05.09.2013, 22:03. Просмотров 405. Ответов 5
Метки нет (Все метки)

Помогите, пожалуйста разобраться с ошибкой.Вот ответ компилятора:
root@FRIDAY13:~/Desktop/C/Chapter6# ./test23
Zapolnenie massiva(sluchaino-0, rukami-1): 1

Ошибка сегментирования
root@FRIDAY13:~/Desktop/C/Chapter6# ./test23
Zapolnenie massiva(sluchaino-0, rukami-1): 0

Ошибка сегментирования


А вот сам код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/* Нужно написать программу, которая создает одномерный массив, размером в 12 элементов. Затем заполняет его либо с клавиатуры (разрешается вводить числа в интервале от 0 до 99), либо генерирует его содержимое с помощью генератора случайных чисел, в интервале от 0 до 99. Для выбора одного из двух вариантов заполнения, программа задает вопрос пользователю. Затем программа должна инвертировать массив, путем замены значения первого элемента на последний, второго на предпоследний и так далее. Вывод на экран должен происходить ровно два раза: до инверсии и после. */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
 
void setRand(int[], const int);
void invertArray(int[], const int);
void printArray(int[], const int);
 
int main()
{
   const int lenght = 12;
   int i, array[lenght];
   bool label;
 
   srand(time(NULL));
 
   // каким образом будем заполнять массив
   printf("Zapolnenie massiva(sluchaino-0, rukami-1): ");
   scanf("%d", &label);
   printf("\n");
 
   // если будем заполнять вручную, вводом с клавиатуры
   if (label)
      for (i = 0; i < lenght; i++) {
         printf("Vvedite %d element pervogo chisla ot 0 do 99:", i);
         scanf("%d", array[i]);
 
         // если небыл соблюден интревал, то возвращаемся на начало итерации
         if (array[i] < 0 || array[i] >= 100) {
            printf("vihod za dopustimiy interval.Povtorite vvod\n");
            i--;
         }
      }
   // иначе заполняем рандомно
   else
      setRand(array, lenght);
 
   // заполнили массив - теперь выводим его на экран
   // затем инвертируем и опять выводим
   printArray(array, lenght);
   invertArray(array, lenght);
   printArray(array, lenght);
 
   return 0;
}
 
// рандомное заполнение массива
void setRand(int arr[], const int len)
{
   int i;
   for (i = 0; i < len; i++)
      arr[i] = rand() % 100;
}
 
// инверсия массива
void invertArray(int arr[], const int len)
{
   int i, temp;
   for (i = 0; i < len / 2; i++){
      temp = arr[i];   
      arr[i] = arr[len - i - 1];
      arr[len - i - 1] = temp;
   }
}
 
// печать массива
void printArray(int arr[], const int len)
{
   int i;
   for(i = 0; i < len; i++)
      printf("%3d", arr[i]);
 
   printf("\n");
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2013, 22:03
Ответы с готовыми решениями:

IIS- asp ошибка: HTTP 500.100 - Внутренняя ошибка сервера - ошибка ASP Internet Information Services
Привет! Конфигурация win2000pro sp2, стандартный IIS, IE 5. При попытке обратиться к...

Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове метода контекста (ПрочитатьИзменения): Ошибка записи!
Доброго всем времени суток! подскажи пожалуйста как исправить ошибку: Ошибка при чтении изменений...

Ошибка при добавлении в файл. Ошибка 101: Ошибка записи на диск (Error 101: Disk write error).
Здравствуйте, возникла проблема такого плана. Нужно произвести добавление записи в файл, но после...

Django Ошибка доступа (403) Ошибка проверки CSRF. Запрос отклонён
На хостинге разместил сайт и не могу войти в админку, т.к. возникает 403 ошибка &quot;Ошибка доступа...

Ошибка SQL запроса , в базе работает, а через IBQuery в Delphi ошибка
В Combobox загружены имена организаций. Нужно выполнить запрос на вывод всех полей таблицы...

5
Forveg
7 / 7 / 5
Регистрация: 14.08.2013
Сообщений: 20
05.09.2013, 22:43 2
Цитата Сообщение от Kontaktnik Посмотреть сообщение
scanf("%d", array[i]);
array[i] = *(array+i) - это само значение, а функции scanf нужен адрес:
C
1
scanf("%d",array+i)
0
Kontaktnik
2 / 2 / 2
Регистрация: 22.08.2012
Сообщений: 24
05.09.2013, 23:29  [ТС] 3
как-то это, по меньшей мере, странно array+i.

Проблема с сегментацией решилась. Две корректировке сделаны.

C
1
2
        printf("Vvedite %d element pervogo chisla ot 0 do 99:", i);
         scanf("%d", array[i]);
Здесь поставил амперсанд &

C
1
2
3
   // каким образом будем заполнять массив
   printf("Zapolnenie massiva(sluchaino-0, rukami-1): ");
   scanf("%d", &label);
в этом кусочке кода поменял спецификатор с %d на %c, ибо вылазит ошибка этой сегментации.
Но одна проблема осталась. Рандомно массив не заполняется. Что не нажимаю 1 или 0, всегда программа предлагает руками заполнять. Что сделано не так ? И как этот спецификактор повлиял ?
0
fasked
Эксперт С++
5002 / 2581 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
06.09.2013, 00:02 4
Цитата Сообщение от Kontaktnik Посмотреть сообщение
в этом кусочке кода поменял спецификатор с %d на %c, ибо вылазит ошибка этой сегментации.
Но одна проблема осталась. Рандомно массив не заполняется. Что не нажимаю 1 или 0, всегда программа предлагает руками заполнять. Что сделано не так ? И как этот спецификактор повлиял ?
Потому что %c это символ, а не число. При этом после конвертации в _Bool и "0" и "1" является истиной, поскольку ASCII обоих символов отличен от 0.
C
1
2
3
4
int tmp = 0;
scanf("%d", &tmp); 
 
label = tmp;
А вообще лучше просто всегда int использовать.
1
Forveg
7 / 7 / 5
Регистрация: 14.08.2013
Сообщений: 20
06.09.2013, 00:22 5
Цитата Сообщение от Kontaktnik Посмотреть сообщение
как-то это, по меньшей мере, странно array+i
Что странного? В scanf передаёшь адрес, по которому запишется введенное значение. Вообще array+i == &array[i], но
первое лаконичней.
0
Kontaktnik
2 / 2 / 2
Регистрация: 22.08.2012
Сообщений: 24
06.09.2013, 16:03  [ТС] 6
Цитата Сообщение от fasked Посмотреть сообщение
Код C
1
2
3
4
int tmp = 0;
scanf("%d", &tmp);
label = tmp;
Спасибо. Вот я в этом и разобрался, а то искал спецификатор под bool.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
06.09.2013, 16:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2013, 16:03

Ошибка разбора XML/ Ошибка при вызове метода контекста (Прочитать)
1C 8.2 Документооборот КОРП 1.2 Текст ошибки...

Загружается до окна приветствия и вылетает ошибка: isass.exe - Системная ошибка
Ребята, помогите кто может... весь день бьюсь безрезультатно... с утра пришёл на работу а сервак...

ASP: Response.Redirect - не работает, ошибка `500 - Внутренняя ошибка сервера'
Всем привет! Есть в ASP-сраничке такой код: Response.Redirect 'page1.asp?ReturnTo=page2.asp' ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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