Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2009, 20:01   #1
Ned_01
Новичок
Джуниор
 
Регистрация: 29.10.2009
Сообщений: 6
По умолчанию Массивы - some problems...

Собственно, вот код моей программы(писано на С):
Код:
#include "stdafx.h"
#include "conio.h"
#include "math.h"


int _tmain(int argc, _TCHAR* argv[])
{
	const int n = 10;
	double a [10];
	int min_i;        //min_i - номер эл. минимального по модулю
	for (int i = 0; i < n ; i++)
	{
		printf("\n a[%i]= ",i);
		scanf("%lf",&a[i]);
		if (fabs(min) < fabs(a[i])) min_i = i; 
	}

	printf ("\n%lf", a[min_i]);
	getch();
	return 0;
}
Коротко: Юзер должен ввести с клавиатуры элементы массива, далее программа вычисляет наименьший по модулю элемент в массиве и выводит его номер на экране. Теперь, о траблах.

1. После того как я собственноручно введу элементы массива, программа выдает "Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted." Что это за зверь, и как с ним бороться?

2. В конце кода я поставил оператор, который должен, по идее, вывести на экран значение этого самого наименьшего по модулю элемента. Но, я упорно боролся, так и не разобрался, почему этот элемент равен "-92559...", когда я ввожу вполне адекватные числа от одного до десяти.

Буду благодарен

Последний раз редактировалось Ned_01; 29.10.2009 в 20:06.
Ned_01 вне форума Ответить с цитированием
Старый 29.10.2009, 20:07   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

В таком виде у меня скомпилировалось и работает. Изменения в комментариях:
Код:
#include <conio.h>
#include <stdio.h> // Для printf и scanf
#include <math.h> 
#include <tchar.h> // Для _TCHAR и _tmain

int _tmain(int argc, _TCHAR* argv[])
{
	const int n = 10;
	double a [10];
	int min_i = 0;        // индекс минимального значения должен быть инициализирован. Я выбрал как минимальный - первый.
	for (int i = 0; i < n ; i++)
	{
		printf("\n a[%i]= ",i);
		scanf("%lf",&a[i]);
		if (fabs(a[min_i]) > fabs(a[i])) min_i = i; // сравнивать надо элементы массива, а не индекс минимального и элемент массива
	}

	printf ("\n%lf", a[min_i]);
	getch();
	return 0;
}

Последний раз редактировалось netrino; 29.10.2009 в 20:16.
netrino вне форума Ответить с цитированием
Старый 29.10.2009, 20:36   #3
Ned_01
Новичок
Джуниор
 
Регистрация: 29.10.2009
Сообщений: 6
По умолчанию

Ошибка со стэком исправилась, а вот на экран всё равно выводится значение "-925..." я даже полностью скопировал исправленный код

Последний раз редактировалось Ned_01; 29.10.2009 в 20:38.
Ned_01 вне форума Ответить с цитированием
Старый 29.10.2009, 20:48   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Странно, у меня именно этот код отлично работает. Вы значение n не меняли? Если объявить массив как
Код:
double a[10] = { 0 };
то что выводит?
netrino вне форума Ответить с цитированием
Старый 29.10.2009, 21:00   #5
Ned_01
Новичок
Джуниор
 
Регистрация: 29.10.2009
Сообщений: 6
По умолчанию

Код:
const int n = 10;
double a [10] ={0};
извиняюсь, но ошибка со стеком никуда не исчезала. просто я заканчивал программу непосредственно через esc, и сообщения о стеке не выводилось

зато появилась еще: "There is no source code available for the current location."

Возможно, дело в моем компиляторе или даже компьютере..
Ned_01 вне форума Ответить с цитированием
Старый 29.10.2009, 21:21   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

И какой же у Вас компилятор?
"Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted." говорит о выходе за пределы массива, расположенного в стеке, то есть о выходе за пределы массива a.
"There is no source code available for the current location." это сообщение появляется во время отладки, когда в ходе отладки Вы пытаетесь войти в функцию, которая не описана в Вашем проекте или во включаемых файлах. Попробуйте запустить программу не в режиме отладки, а просто. Перед циклом попробуйте вставить fflush(stdin) и переписать scanf("%lf",&a[i]); как scanf(" %lf",&a[i]);(с пробелом перед %)
netrino вне форума Ответить с цитированием
Старый 29.10.2009, 21:34   #7
Ned_01
Новичок
Джуниор
 
Регистрация: 29.10.2009
Сообщений: 6
По умолчанию

Использую Visual Studio 2008.
Насчет "Run-Time": я понял, что говорится про выход за пределы массива. И, насколько я знаю, нумерация в си в массивах начинается с 0. Т.е.,
Код:
 int b[5] =  {1, 2, 3} 
// b[0] = 1, b[1] = 2, b[2] = 3, b[3] = 0, b[4] = 0
Но, я думал я ограничил счётчик i, чтобы он не выходил за пределы, через
Код:
int i = 0; i < n
сейчас опробую Ваш совет
Ned_01 вне форума Ответить с цитированием
Старый 29.10.2009, 21:38   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Странно, я проверил на VS2008 и VS2010 beta 2, всё работает отлично. Попробуйте пересоздать проект и запустить в нём.
netrino вне форума Ответить с цитированием
Старый 29.10.2009, 22:24   #9
Ned_01
Новичок
Джуниор
 
Регистрация: 29.10.2009
Сообщений: 6
По умолчанию

Программа запускается и моментально же закрывается.
Ned_01 вне форума Ответить с цитированием
Старый 29.10.2009, 22:30   #10
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

мда... выложите архив проекта.
Ещё можете попробовать использовать безопасный вариант scanf - scanf_s, вызов тот же. и замените getch() на _getch()
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны одномерные массивы А и В. Сформировать массивы, состоящие из элемент LyaLya Помощь студентам 15 20.12.2009 14:12
массивы ShadowCat Помощь студентам 3 02.11.2009 19:14
массивы Еля Общие вопросы C/C++ 2 10.09.2009 20:13
Массивы Snord Общие вопросы Delphi 2 12.04.2008 13:45