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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2010, 05:56   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Подсчет негативных элементов массива преобразованных из строки

#Всем доброго времени суточек, уважаемые пользователи данного форума.
.So, I have some trouble with string conversation

В структуре маю следующий массив:
Код:
 struct VectorStruct {
	char *Vector[100]; 
	int n;
}; VectorStruct Index;
Здесь суммирую негативные элементы, но меня шлют далеко и на долго, мол секция записи "access violation when read":
Код:
int Sum = 0;
for (int i = 0; i < *pSize; i++)
{
    if (atoi(*Table[i].Vector) < 0)
    {
        Sum+= atoi(*Table[i].Vector);
    }
}
p.s. По идее все смотреться неплохо, в чем может быть проблема?
coNsept вне форума Ответить с цитированием
Старый 23.09.2010, 07:55   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
char *Vector[100];
Это массив строк, или тут подразумевается строка из 100 символов?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.09.2010, 09:47   #3
blob
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 34
По умолчанию

Выложи кусок кода побольше.
Надо полагать, что VectorStruct у тебя хранит одно число в формате строки, так ? Что за структура у Table ? Думаю ответ родится сразу, как только пояснишь
blob вне форума Ответить с цитированием
Старый 23.09.2010, 22:53   #4
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Цитата:
Это массив строк, или тут подразумевается строка из 100 символов?
Как массив строк.

Весь код:


Код:
// Main.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <iostream>
#include <string>
#include <string.h>

struct VectorStruct {
	char *Vector[100]; 
	int n;
}; VectorStruct Index;

VectorStruct Access;
VectorStruct Table[100];

int Size, *pSize;

void Interface()
{
	printf("--------------------------------------------------------------------------------");
	printf("\t\t\t   - Operatiile cu vector -\n");
	printf("--------------------------------------------------------------------------------");
	printf("[1].#Initializarea\n");
	printf("[2].#Eliminarea\n");
	printf("[3].#Modificarea dimensiunii\n");
	printf("[4].#Acces la elementele\n");
	printf("[5].#Calcul produsului elementelor negative\n");
	printf("[6].#Afisarea\n");
	printf("[7].#Iesire din program\n");
	printf("--------------------------------------------------------------------------------");
}

void scanVector(VectorStruct Table[])
{ 
	for (int i = 0; i < *pSize; i++)
	{
		printf("[%d]: ", i + 1); 
		scanf("%s", &Table[i].Vector);
	}
	Access.n = *pSize;
}

void printVector(VectorStruct Table[])
{
	for (int i = 0; i < *pSize; i++)
	{
		printf("[%s]", Table[i].Vector);
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	bool Step = TRUE, Select = TRUE;

	Access.n = 0;

	while (Step)
	{
		Interface();

		switch (_getch())
		{
		case '1':
			{ 
				if (Select)
				{
					printf("\nIntroduceti dimensiunea: "); scanf("%d", &Size); printf("\n"); pSize = &Size; 
					// ----
					scanVector(&Table[0]);
					// ----
					Select = FALSE;
				}

				printf("\n");
				// ----
				printVector(&Table[0]);
				// ----
				printf("\n\n"); system("PAUSE"); system("CLS");

			} break;

		case '2':
			{
				printf("\n");
				for (int i = 0; i < *pSize; i++)
				{
					memset(Table[i].Vector, 0, *pSize); printf("[%s]", Table[i].Vector); 
				} 
				Select = TRUE;
				printf("\n\n"); system("PAUSE"); system("CLS");
			} break;

		case '3':
			{
				int TempSz;

				printf("\n");
				printf("Introduceti dimensiunea: "); scanf("%d", &TempSz); printf("\n"); *pSize = TempSz;	
				// ----
				for (int i = Access.n; i < *pSize; i++)
				{
					printf("[%d]: ", i + 1); 
					scanf("%s", &Table[i].Vector);			
				}
				printf("\n");
				// ----
				printVector(&Table[0]);
				// ----
				printf("\n\n"); system("PAUSE"); system("CLS");
			} break;

		case '4':
			{
				int Element;

				printf("\nIntroduceti i - numarul elemntului\n");
				printf("\n -> "); scanf("%d", &Element);

				for (int i = 0; i < *pSize; i++)
				{
					if (i == Element)
					{ printf("\nIntroduceti valoare noua: "); scanf("%s", &Table[i].Vector); }
				}

				printf("\n");
				// ----
				printVector(&Table[0]);
				// ----

				printf("\n\n"); system("PAUSE"); system("CLS");
			} break;

		case '5':
			{
				printf("\n");

				int Sum = 0;

				for (int i = 0; i < *pSize; i++)
				{
					if (atoi(Access.Vector[i]) < 0)
					{
						Sum+= atoi(Access.Vector[i]);
					}
				}

				printf("\n Suma elementelor negative = %d", Sum);

				printf("\n\n"); system("PAUSE"); system("CLS");
			} break;

		case '6':
			{
				printf("\n"); printVector(&Table[0]); printf("\n\n"); system("PAUSE"); system("CLS");
			} break;

		case '7':
			{
				ExitProcess(0); // sau Step = FALSE;
			} break;

		default: system("CLS"); MessageBoxA(NULL, "Ati apasat butonul gresit!", "#Mesaj", MB_ICONWARNING); 
		}
	}
	printf("\n"); system("PAUSE"); return 0;
}
5-ый кейс

Последний раз редактировалось coNsept; 23.09.2010 в 22:59.
coNsept вне форума Ответить с цитированием
Старый 24.09.2010, 00:28   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2coNsept
код очень страшный. чего тока стоит эта часть
Код:
scanf("%s", &Table[i].Vector);
в данном случае scanf ожидает вторым параметром char *, а ты ей передаешь указатель на массив из 100 элементов типа char *. сюда же, нигде не увидел, где ты выделяешь память под эти строки. жееесть, просто жесть.
пс. чо за итальянский?
ппс. лучше напиши, что должно быть в итоге
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 24.09.2010, 01:33   #6
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Хм, а разве под статичный строковый массив нужно выделять память?
У меня просто такое понятие, если char* тогда выделяю память, если массив статичный к примеру char* [], тогда я этого не делаю. (Точнее сказать я даже и не в курсе был нужно ли это, так как и так вижу сколько возможно использовать элементов, не изучил я еще всех тонкостей).
Кстати, буду рад любой критики кода, жду исправлений и пояснений дабы в следующий раз писать код более правильным и элегантным. За ранее благодарен.
Цитата:
ппс. лучше напиши, что должно быть в итоге
Прочти тему топика. (А дальше я сам все исправлю и сделаю что нужно)
coNsept вне форума Ответить с цитированием
Старый 24.09.2010, 01:49   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2coNsept
это не строковый массив. у тебя массив из 100 указателей на тип char. он будет строковым массивом (или двумерным символьным массивом, как угодно), если ты выделишь для каждого элемента память под строку. пока у тебя кучка указателей ни на что.
код критиковать не буду, очень уж я пылкий на критику, понимаешь. могу посоветовать только пользоваться нормальным компилятором, собирать свои программы с высоким уровнем показа варнингов и внимательно их читать.
этому коду поможет только ggdG
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 30.09.2010, 17:56   #8
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Такой вариант по лучше, на взгляд?

Код:
// Main.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <iostream>
#include <fstream>

int Size = 0, RecordSz, *pSize;

struct VectorStruct 
{ 
	// ----
	char **Vector;
	// ----

	void Initialize(char InputString[], int Counter)
	{
		Vector[Counter] = new char[strlen(InputString) + 1];
		strcpy(Vector[Counter], InputString);
	}

    void FreeMemory()
	{
		for (int i = 0; i < *pSize; i++)
		{
			delete [] Vector[i]; Vector[i] = NULL;
		}
	}
};

void Interface();
void printVector(VectorStruct p);
int VectorProd(VectorStruct p);

void main(void)
{
	// ----
	char InputString[100];
	bool Step = TRUE;
	VectorStruct Index;
	// ----

	pSize = &Size;

	while (Step)
	{
		system("CLS");
		// ----------
		Interface();
		// ----------

		switch (_getch())
		{
		case '1':
			{
				printf("\n");
				printf("Introduceti dimensiunea: "); scanf("%d", &Size); RecordSz = Size; pSize = &Size; 		
				printf("\n");

				for (int i = 0; i < *pSize; i++)
				{
					printf(" -> "); scanf("%s", &InputString);
					// ----------
					Index.Initialize(InputString, i);
					// ----------
				}

				printf("\n");

				// ----------
				printVector(Index);
				// ----------
			} break;

		case '2':
			{
				// ----------
				Index.FreeMemory();
				// ----------
				printf("\n");
				// ----------
				printVector(Index);
				// ----------
			} break;

		case '3':
			{
				int NewSize;

				printf("\n");
				printf("Introduceti dimensiunea: "); scanf("%d", &NewSize); pSize = &NewSize;
				printf("\n");

				for (int i = RecordSz; i < NewSize; i++)
				{
					printf(" -> "); scanf("%s", &InputString);
					// ----------
					Index.Initialize(InputString, i);
					// ----------
				}
				
				printf("\n");
				   
				// ----------
				printVector(Index);
				// ----------

			} break;

		case '4':
			{
				// ----
				int Select; 
				char ChangeString[100];
				// ----

				printf("\n");
				printf("(Total elemente %d) | Alegeti element: ", *pSize); scanf("%d", &Select);
				printf("\n");

				if (Select > *pSize)
				{ MessageBoxA(NULL, "Asa element nu exista", "Eroare!", MB_ICONWARNING); break; }

				for (int i = 0; i < *pSize; i++)
				{
					if (Select == i)
					{
						printf(" -> "); scanf("%s", &ChangeString);
						// ----------
						Index.Initialize(ChangeString, i);
						// ----------
					}
				}   
				// ----------
				printVector(Index);
				// ---------- 

			} break;

		case '5':
			{
				printf("\nProdusul elementelor negative = %d", VectorProd(Index)); 

			} break;

		case VK_ESCAPE:
			{
				ExitProcess(0);
			} break;

		default: MessageBoxA(NULL, "Datele introduse sunt incorecte", "Eroare!", MB_ICONWARNING);
		}
		_getch(); 
	} 

	printf("\n"); system("PAUSE");
}

void Interface()
{
	printf("================================================================================");
	printf("                                  [VECTOR]\n");
	printf("================================================================================");
	printf("#--1 : Initializare\n");
	printf("#--2 : Stergere\n");
	printf("#--3 : Modificarea dimensiunii\n");
	printf("#--4 : Acces/modificarea elementelor\n");
	printf("#--5 : Calcularea produsului elementelor negative\n");
	printf("#ESC : Iesire din program\n");
	printf("================================================================================");
}

void printVector(VectorStruct p)
{
	for (int i = 0; i < *pSize; i++) 
	{ 
		printf("[%s]", p.Vector[i]); 
	} 
}

int VectorProd(VectorStruct p)
{
	int Sum = 1;

	for (int i = 0; i < *pSize; i++)
	{
		if (atoi(p.Vector[i]) < 0)
		{
			Sum*= atoi(p.Vector[i]);
		}
	}
	return Sum;
}

Последний раз редактировалось coNsept; 30.09.2010 в 17:58.
coNsept вне форума Ответить с цитированием
Старый 30.09.2010, 18:41   #9
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2coNsept
Цитата:
Такой вариант по лучше, на взгляд?
неа

Код:
	char **Vector;
	// ----

	void Initialize(char InputString[], int Counter)
	{
		Vector[Counter] = new char[strlen(InputString) + 1];
		strcpy(Vector[Counter], InputString);
	}
ты используешь указатель на указатель, но память под этот массив указателей (на который должен указывать твой указатель на указатель) не выделяешь. а выделяешь сразу память под указатель)
т.е уже при обращении Vector[Counter] твоя прога должна упасть. может в дебаге ты и выживешь. но врядли
ты же понимаешь, что это равносильно *(Vector + Counter)? и если по этому смещению лежит не "что-то из мусора", а 0, упадет. ибо нулевой указатель нельзя разыменовывать)

"аписняю".

char *c; указатель на тип char. можно выделить для него память, как c = new char[128]; и он будет указывать на память длиной 128 байт. тут все тривиально.
далее. char **c. указатель на указатель. чтобы его использовать, необъодимо выделить память под обычные указатели:
c = new char*[10]; получили в памяти массив из 10-указателей. далее уже для этих указателей можно выделить память, где можно хранить данные

for (int i = 0; i < 10; i++)
c[i] = new char[128];

для 10 указателей выделяем память из 128 байт. и вот только теперь память можно заполнять. например
strcpy(c[2], "string");

теперь сравни со своим кодом.

оставил бы
char *Vector[100];
как в исходном варианте, твоя инициализация (дальше не смотрел) была бы правильная. но тут у тебя массив указателей динамический

короче, k&r до посинения и последующего просветления)

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

вот прогнал то я тираду....
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 30.09.2010 в 18:50.
pproger вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод элементов массива.Изменение элементов массива. Vesnushka18 Помощь студентам 6 09.06.2011 13:05
подсчет элементов в массиве счастливая Помощь студентам 1 17.05.2010 19:11
УЦВМ, сумма элементов заданной строки массива sig_GB Помощь студентам 9 04.03.2010 23:29
найти среднее арифметическое элементов массива состоящее из 5 элементов viatlon Общие вопросы C/C++ 9 12.12.2009 00:45
В одномерном массиве, состоящем из n вещественных элементов, вычислить сумму элементов массива HazelHen Общие вопросы C/C++ 2 29.03.2009 15:16