Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: JonnySilver
Дата сообщения: 26.05.2004 11:18
Crazy_Shrike

Цитата:
Люди, представляете, а у меня не работает!!! Хотя точно то же самое.

Чтобы было ТОЧНО ТОЖЕ САМОЕ, нужно код один к одному скопировать, а у тебя, как я понял и размерности другие и еще может где-то натычка... Ищи ошибочку.

Цитата:
Кстати, "void rat()" - это классический прикол программистов С или солидарность со мной?

просто скопировал что было, и подправил, вот.
Автор: Swappp
Дата сообщения: 26.05.2004 21:50
Dark_Wizard

Цитата:
А почему без std:: ?

Вообще std должен быть, или в начале должна быть строка "using namespace std;" и "#include <iostream>" без .h, но похоже Borland C++ 5 не соответствует стандартам кажется 98 года. Попробуй чтонибудь поновее.
Crazy_Shrike

Цитата:
void rat(int mas[][8]);

int main(int argc, char* argv[])
{
int Mas[4][8] = {{1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2},{3,3,3,3,3,3,3,3},{4,4,4,4,4,4,4,4}};

rat(Mas);

return 0;
}

//
void rat(int mas[][8])
{
for (int i=0;i<4;i++) {
for (int j=0;j<8;j++) {
printf("%d", mas[i][j]);
}
}
}

Оффтоп конечно, но не проще ли поменять rat и main местами, и убрать объявление rat вначале?
Автор: Crazy_Shrike
Дата сообщения: 27.05.2004 09:24

Цитата:
но не проще ли поменять rat и main местами, и убрать объявление rat вначале?


Гы... и че?

А про void rat() был прикольчик на курсах. Препод пишет пример,.. Есть у нас функция void rat() ... почему rat? Ну, она ничего не возвращает - значит крыса...

Я думал, что это известный всем прикол, но оказалось, что придумал препод...
Автор: JonnySilver
Дата сообщения: 27.05.2004 11:51
Swappp

Цитата:
... но не проще ли поменять rat и main местами, и убрать объявление rat вначале?

Это что-то сильно упростит? На скорость выполнения повлияет?
А если серьезно, то мне нравится видеть объявления функций в начале, особенно когда много кода нагородишь. Привычка, блин.
Автор: Crazy_Shrike
Дата сообщения: 27.05.2004 15:15

Цитата:
мне нравится видеть объявления функций в начале


А можно как-то по-другому???
Ну, конечно, если сразу их там реализовывать, как в паскале - то вопросов нет, а иначе без объявления низя...


Добавлено
Насчет неправильной передачи массива ни у кого свежих мыслей нет?
Автор: JonnySilver
Дата сообщения: 27.05.2004 17:14
Crazy_Shrike

Цитата:
А можно как-то по-другому???

Можно и по другому. а) Объявлять нужную функцию там , откуда она будет вызвана (из другой функции), б) расположить функции в порядке вызова - ну это почти фантастика.


Цитата:
Передается только часть массива, скажем, из десяти строк четыре передаются правильно, а остальные - случайные числа, как будто их просто не инициализировали и они показывают содержимое ячеек выделенной памяти.

Ты код нарисуй, чтобы посмотреть можно было...
Автор: Swappp
Дата сообщения: 27.05.2004 19:45
Crazy_Shrike
JonnySilver

Цитата:
Привычка, блин.

ага

Цитата:
Насчет неправильной передачи массива ни у кого свежих мыслей нет?

Может код покажешь? А то приведенный выше нормально работает...
Автор: Crazy_Shrike
Дата сообщения: 28.05.2004 09:46
//В главном .cpp - файле:

//объявление массива:
int mas[8][4];

//......инициализация......

//Передача в файл реализации методов:

Essence[i].Rat(mas);


//Прототип в заголовочном файле:

void Rat(int mas[][4]);


//Реализация в файле реализации методов класса:

void CEssence::Rat(int mas[][4])
{

//Вывод массива... В файл, но это не принципиально... Считаем, просто вывод...

ofstream outfile("file.txt",ios::out);
for(int i=0;i<8;i++)
{
for(int j=0;j<4;j++)
{
outfile<<mas[i][j]<<" ";
}
outfile<<endl;
}
}


И, еще раз повторюсь... главное - что, если вывод сделать в функции, принадлежащей главному файлу - все зашибись!

Добавлено

Цитата:
расположить функции в порядке вызова - ну это почти фантастика.


Гы. Если это не программа суммирования двух чисел с последующим выводом в консоль, то такое действительно невозможно...
Автор: JonnySilver
Дата сообщения: 28.05.2004 22:31
Вот так все правильно работает (пример на VC++ 6):

//---------------------------------------------------------------------------
// mas.cpp : Defines the entry point for the console application.
//---------------------------------------------------------------------------
#include "stdafx.h"

int Mas[4][8] = {{1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2},{3,3,3,3,3,3,3,3},{4,4,4,4,4,4,4,4}};

int main(int argc, char* argv[])
{

CTest test;
test.PrintMas(Mas);

return 0;
}

//---------------------------------------------------------------------------
// MyClass.cpp
//---------------------------------------------------------------------------
#include "stdafx.h"

void CTest::PrintMas(int Mas[][8])
{
for (int i=0;i<4;i++) {
for (int j=0;j<8;j++) {
printf("%d", Mas[i][j]);
}
}
};

//---------------------------------------------------------------------------
// stdafx.cpp : source file that includes just the standard includes
//mas.pch will be the pre-compiled header
//stdafx.obj will contain the pre-compiled type information
//---------------------------------------------------------------------------

#include "stdafx.h"

// TODO: reference any additional headers you need in STDAFX.H
// and not in this file

//---------------------------------------------------------------------------
// MyClass.h
//---------------------------------------------------------------------------
extern int Mas[4][8];

class CTest {
public:
void PrintMas(int Mas[][8]);
};

//---------------------------------------------------------------------------
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//---------------------------------------------------------------------------

#if !defined(AFX_STDAFX_H__D8B8C5DD_38B5_45A3_8609_C0F64523BFA3__INCLUDED_)
#define AFX_STDAFX_H__D8B8C5DD_38B5_45A3_8609_C0F64523BFA3__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define WIN32_LEAN_AND_MEAN// Exclude rarely-used stuff from Windows headers

#include <stdio.h>
// TODO: reference additional headers your program requires here
#include "MyClass.h"

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__D8B8C5DD_38B5_45A3_8609_C0F64523BFA3__INCLUDED_)
Автор: Swappp
Дата сообщения: 28.05.2004 23:09
Crazy_Shrike
Что то я не очень понимаю... куски не полные...
Зачем
Цитата:
void Rat(int mas[][4]);

когда Rat это метод класса? или CEssence это namespace?

Цитата:
Если это не программа суммирования двух чисел с последующим выводом в консоль, то такое действительно невозможно

Хм, я вроде писал, что то сложнее калькулятора, или я ошибался на самом делее там функций было не больше трех, не считая main, все остальное в классах...
JonnySilver

Цитата:
#include "stdafx.h"

обьясните глупому, зачем нужен этот stdafx.h? Первый мой компилятор gcc по этому не очень понимаю, там такого нету И вообще пытаюсь писать код, котрый можно будет скомпилировать основными современными компиляторами (C++ компилятор от VS.NET 2003 и GCC) и под разные платформы (пока это мне удается , правда для GUI приходится использовать Qt).

Цитата:
В записи выражения "std::cout << ..." подразумевается, что std - это класс.
Нет такого класса - std.

поправочка, std это не класс, это пространство имен (namespace), в ANSI C++ все стандартные классы (из iostream, fstream и т.д) должны быть помещены в это пространство, а использовать их можно либо прописав в начале "using namespace std;" либо приписывая к каждому классу "std::". Если компилятор отказывается компилировать такой код, это означает лишь одно, он устарел.
Автор: JonnySilver
Дата сообщения: 28.05.2004 23:33
Swappp
Разные компиляторы у нас...


Цитата:
зачем нужен этот stdafx.h?

VC++6 - Win32 Console Application - проект был создан с помощью мастера

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently


Цитата:
Если компилятор отказывается компилировать такой код, это означает лишь одно, он устарел.

У меня VStudio98 + последний Platform SDK. А использовать std:: в нем не было надобности.


Цитата:
namespace

(MSDN for VS98)
A namespace declaration identifies and assigns a name to a declarative region.
Defining namespace Members
Members of a namespace may be defined within that namespace. For example:

namespace X { void f() { } }

Members of a named namespace can be defined outside the namespace in which they are declared by explicit qualification of the name being defined. However, the entity being defined must already be declared in the namespace. In addition, the definition must appear after the point of declaration in a namespace that encloses the declaration’s namespace. For example:

namespace Q {
namespace V {
void f();
}

void V::f() { } // ok
void V::g() { } // error, g() is not yet a member of V

namespace V {
void g();
}
}
Автор: Swappp
Дата сообщения: 28.05.2004 23:50
Crazy_Shrike
Вот, что у меня получилось...

Код: //cessence.cpp
#include <iostream>
#include "cessence.h"
using namespace std;
extern int mas[8][4];
void CEssence::Rat()
{
for(int i=0;i<8;i++)
{
for(int j=0;j<4;j++)
{
cout<<mas[i][j]<<" ";
}
cout<<endl;
}
}
Автор: JonnySilver
Дата сообщения: 29.05.2004 00:04
Crazy_Shrike
У у меня тоже работает. И вариант другой. Проверяй, где-то у тебя натычка.
Автор: Swappp
Дата сообщения: 29.05.2004 02:08
JonnySilver

Цитата:
У меня VStudio98 + последний Platform SDK. А использовать std:: в нем не было надобности.

VS C++ 6 вроде соответствует ANSI-C++, но насколько я помню, только с какогото SP, поэтому оставили для совместимости. А в том посте упоминался C++ builder 5, вот на счет его я сомневаюсь.
В GCC код без std:: или using namespace std; вообще отказывается компилироваться, что вобщем правильно. VS .NET 2003 тоже:

Цитата:
I:\projects\tmp\test--->cl cessence.cpp main.cpp /EHs
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

cessence.cpp
cessence.cpp(13) : error C2065: 'cout' : undeclared identifier
cessence.cpp(15) : error C2065: 'endl' : undeclared identifier
cessence.cpp(15) : error C3861: 'cout': identifier not found, even with argument
-dependent lookup
main.cpp
Generating Code...

(код приведенный выше, без using namespace std)
так, что как писать, чтобы потом можно было легко переносить на новые компиляторы решай сам...
Автор: JonnySilver
Дата сообщения: 31.05.2004 04:32
Swappp
Признаю свою ошибку. Не учел особенностей компилятора.

Цитата:
VS C++ 6 вроде соответствует ANSI-C++, но насколько я помню, только с какогото SP
У меня SP5.
Автор: Crazy_Shrike
Дата сообщения: 02.06.2004 14:38
2 Swapp

Дык, в приведенном коде массив-то не передается...
Автор: Swappp
Дата сообщения: 02.06.2004 22:21
Crazy_Shrike
Я не понял, что ты хотел сказать написанным выше... по этому написал немного не то, но потом дошло, но было уже позно скорее всего у тебя неправильно определен прототип функции, хотя если функция вообще существует... void CEssence::Rat(int mas[][4]) это не функция, это метод класса, для его использования достаточно объявить класс, а не
Цитата:
//Прототип в заголовочном файле:
void Rat(int mas[][4]);

p.s. и всетаки у меня передается переменная, правда не между функциями, а между файлами
Автор: Crazy_Shrike
Дата сообщения: 03.06.2004 08:57
Во, по-моему, приближаемся в проблеме...
Да, я тоже провтыкал, это действительно метод класса. Ошибся, когда код выбирал...



Цитата:
достаточно объявить класс


Не понял??? Примерчик можно?
Я так понимаю, что проблема в прототипе метода?... ... Блин... В общем, там где описан класс, есть только прототипы его методов. Их реализация - в другом файле. Проблема в именно в прототипе? Разве тут все не так, как в обычных функциях?


Добавлено
Только не бейте меня и не выкидывайте из форума за вопрос, который я сейчас задам...
Как бы так объявить этот самый массив, чтоб его было видно из всех файлов, шоб, блин, его не нужно было передавать?
Автор: JonnySilver
Дата сообщения: 03.06.2004 16:19
Crazy_Shrike

Цитата:
2 Swapp

Дык, в приведенном коде массив-то не передается...


В моем коде передается (подправленный вариант):
//---------------------------------------------------------------------------
// main.cpp : Defines the entry point for the console application.
//---------------------------------------------------------------------------

#include <stdio.h>
#include "cessence.h"

int Mas[4][8] = {{1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2},{3,3,3,3,3,3,3,3},{4,4,4,4,4,4,4,4}};

int main(int argc, char* argv[])
{

CEssence Essence;
Essence.Rat(Mas);

return 0;
}

//---------------------------------------------------------------------------
// cessence.cpp
//---------------------------------------------------------------------------
#include "cessence.h"

void CEssence::Rat(int mas[][8])
{
for (int i=0;i<4;i++) {
for (int j=0;j<8;j++) {
printf("%d", mas[i][j]);
}
}
};

//---------------------------------------------------------------------------
// cessence.h
//---------------------------------------------------------------------------
extern int Mas[4][8];

class CEssence {
public:
void Rat(int Mas[][8]);
};


Автор: Swappp
Дата сообщения: 03.06.2004 17:14
Crazy_Shrike

Цитата:
Только не бейте меня и не выкидывайте из форума за вопрос, который я сейчас задам...
Как бы так объявить этот самый массив, чтоб его было видно из всех файлов, шоб, блин, его не нужно было передавать?

Вот это ты найдешь в моем коде если внимательнее почитаешь, хотя это не очнь хороший стиль... лучше использовать только в крайних случаях.

Цитата:
Примерчик можно?

.h знаешь зачам нужны?

Код: //myclass.h
class MyClass
{
public:
void Rat(int mas[][4]);
//....
}
Автор: JonnySilver
Дата сообщения: 03.06.2004 17:54
Crazy_Shrike
Алло! Тебе полегчало? Код-то заработал хоть чей-нибудь??
Автор: Crazy_Shrike
Дата сообщения: 04.06.2004 09:12
2 swapp:

еxtern - значит переменную видно из других файлов?

2 Silver:

Понимаю всю иронию ситуации... Да, со стороны это смешно. Даже истерически, но, блин, когда натыкаешься на такие проблемы, просто не то что программировать - жить не хочется.

Придется пользоваться плохим стилем и объявлять массив как extern...
Автор: Swappp
Дата сообщения: 04.06.2004 17:22
Crazy_Shrike

Цитата:
еxtern - значит переменную видно из других файлов?

Не совсем... Переменную нельзя просто так определить глобально, каждый .cpp файл компилируется отдельно, для связи этих файлов используется .h файлы, в котрых и прописываются описания функций, классов и общие переменные. Т.е. extern просто указывает компиляторы, что бы он не выводил сообщение об ошибке, а отложил это до линковки. Короче объявляй в основном файле саму переменную, а в других .cpp extern... можно создать .h файл, и в него кинуть extern, тогда из .cpp #include "global.h"

Цитата:
Понимаю всю иронию ситуации... Да, со стороны это смешно. Даже истерически, но, блин, когда натыкаешься на такие проблемы, просто не то что программировать - жить не хочется.

Во-первых, советую взять книжку и почитать, информацию про все написанное тут можно найти почти в любой книге но C++.
Во-вторых, выложи сюда код, а то ошибка скорее всего смешная, мне кажется, ты не очень понимаешь как работает компилятор C++. Вернее как компилируется многофайловая программа.
Автор: JonnySilver
Дата сообщения: 04.06.2004 22:50
Полностью согласен со Swappp.
По сути, задачу в том виде как она была поставлена, мы решили давно.

Цитата:
/В главном .cpp - файле:

//объявление массива:
int mas[8][4];

//......инициализация......

//Передача в файл реализации методов:

Essence[i].Rat(mas);


//Прототип в заголовочном файле:

void Rat(int mas[][4]);


//Реализация в файле реализации методов класса:

void CEssence::Rat(int mas[][4])
{

//Вывод массива... В файл, но это не принципиально... Считаем, просто вывод...

ofstream outfile("file.txt",ios::out);
for(int i=0;i<8;i++)
{
for(int j=0;j<4;j++)
{
outfile<<mas[i][j]<<" ";
}
outfile<<endl;
}
}


И, еще раз повторюсь... главное - что, если вывод сделать в функции, принадлежащей главному файлу - все зашибись!


Я тоже не понимаю, что у тебя может не работать?


Цитата:
Придется пользоваться плохим стилем и объявлять массив как extern...

Плохим стилем это трудно назвать. Мало ли, какие переменные тебе приспичило сделать глобальными...
Долго думал... минут 5 ..... Вроде я тебя понял. Вот так что ли?:
Если бы твой класс содержал переменную - динамический массив, например, то можно было бы написать конструктор или функцию класса, отвечающую за его инициализацию . А затем мучить массив - член класса. Тогда extern не нужен!
реализация:
//---------------------------------------------------------------------------
// main.cpp
//---------------------------------------------------------------------------

#include <stdio.h>
#include "cessence.h"

int Mas[4][8] = {{1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2},{3,3,3,3,3,3,3,3},{4,4,4,4,4,4,4,4}};

int main(int argc, char* argv[])
{
// кол-во строк, колонок, сам массив
CEssence Essence(4,8, (int**)Mas);
Essence.Rat();
return 0;
}

//---------------------------------------------------------------------------
// cessence.cpp
//---------------------------------------------------------------------------
#include "cessence.h"

CEssence::CEssence(int i, int j, int **m)
{
Row = i;
Col = j;

massiv = new int*[Row];
for (int r=0;r<Row;r++) {
massiv[r] = new int[Col];
for (int c=0;c<Col;c++)
massiv[r][c] = (int)*m++; // во-о-о как!
}

};

CEssence::~CEssence()
{
for (int i=0;i<Row;i++)
delete [] massiv[i];
delete [] massiv;
};

void CEssence::Rat()
{
for (int i=0;i<Row;i++) {
for (int j=0;j<Col;j++)
printf("%d", massiv[i][j]);
}
};

//---------------------------------------------------------------------------
// cessence.h
//---------------------------------------------------------------------------

class CEssence {
private:
int** massiv; // копия для работы
int Row,Col; // придется столько удалять

public:
CEssence(int i, int j, int **m); // конструктор
CEssence::~CEssence(); // деструктор

void Rat();
};
Автор: Crazy_Shrike
Дата сообщения: 08.06.2004 09:01

Цитата:
Долго думал... минут 5 ..... Вроде я тебя понял.


Фраза достойная настоящего программера!!!

С динамическим массивом вроде понял. Не совсем понял зачем...

И все-таки, extern тут заработает?
Автор: JonnySilver
Дата сообщения: 09.06.2004 05:51
Crazy_Shrike

Цитата:
И все-таки, extern тут заработает?

extern - для прошлого примера нужен.

А для этого - нет.
Автор: Crazy_Shrike
Дата сообщения: 21.06.2004 16:10
Вот, значит, я снова тут.
Прикол в чем... В общем, сделал я массив внешним (extern) а все равно тот же эффект. Но от нечего деласть я запускал и обрывал программу несколько раз и вдруг массив стал передаваться нормально! Я еще раз перезапустл - снова фигня... В общем, примерно в 10% случаев программа запускается без проблем... Может с компилером че-то? Или тут в ДНК ошибка?
Автор: wiwiw
Дата сообщения: 21.06.2004 23:38
нельзя выносить объявление массива в .h файл и включать его везде. иначе чушь получится.
объяви массив в одном файле .cpp а в других опиши его как extern
Автор: Crazy_Shrike
Дата сообщения: 22.06.2004 12:05
... тогда я сделал массив атрибутом формы... Все то же. Проблема не в том как его объявить, я не знаю в чем проблема! Если его передавать в функции, как это было в начале, тоже иногда запускается. Независимо от объявления процент удачных запусков одинаковый.
Автор: vndovr
Дата сообщения: 23.06.2004 00:25
Crazy_Shrike
Код покажи

Блин, приколисты:

Код:
massiv[r][c] = (int)*m++;

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.