#1 30.10.06 16:40
Вопрос в С++ про класса пямяти.
#include<stdio.h>
static void matrix_multiply(
int result[3][3],
int matrix1 [3][3],
int matrix2 [3][3]
)
{
int row, col, element;
for(row=0;row<3;++row)
{
for(col=0;col<3;++col)
{
result[row][col]=0;
for(element=0;element<3;++element)
{
result[row][col]+=
matrix1[row][element]*matrix2[element][col];
}
}
}
static void matrix_print(
int matrix[3][3]
)
{
int row, col;
for(row=0;row<3;++row)
{
for(col=0;col<3;++col)
{
printf("%d\t", matrix[row][col]);
}
printf("\n");
}
}
int main(void)
{
int matrix_a[3][3]={
{45, 82, 26},
{32, 11, 13},
{89, 81, 25}
};
int matrix_b[3][3]={
{32, 43, 50},
{33, 40, 52},
{20, 12, 32}
};
int result[3][3];
matrix_multiply(result, matrix_a, matrix_b);
matrix_print(result);
return(0);
};
}
Почему класс памяти "static void matrix_print" не допускается?
заранее большое спасибо за помощь.
Offline
#8 30.10.06 18:14
Re: Вопрос в С++ про класса пямяти.
Жесть... Щас покомпилил. Вижуал шестой поплакал что скобки нету.
А передача массива работает!!! Я в шоке! Хиценко застрелилась бы!!
Да, и static здесь ваще роли не играет. Насколько я помню если объекту, описанному внутри блока приписать класс пямяти static то его значение можно юзать вне блока. Вроде еще какие-то изощрения есть, но я не помню.
Offline
#9 30.10.06 18:14
Re: Вопрос в С++ про класса пямяти.
JONIK написал(а):
о скаких пор стали передавать массив целиком в функцию??? Компилер не ругается?
стандарт С++ этого не запрещает. Другое дело, что этот способ в общем случае неэффективен из-за затрат на создание копии массива
JONIK написал(а):
А static вроде функции приписать нельзя....
можно, если ты хочешь ограничить область действия функции модулем, в котором эта функция описана
Offline
#10 30.10.06 18:33
#11 30.10.06 19:31
#12 30.10.06 20:00
Re: Вопрос в С++ про класса пямяти.
имя массива является указателем на его первый элемент (mas == &mas[0][0]), поэтому массив передается по указателю и копия не создается. В этом ты можешь убедиться посмотрев в отладчике адреса у массива result, который в main(), и у массива result, который локальный в matrix_multiply() - они совпадают.
Кстати, я неправильно тут написал
Fatboy написал(а):
Другое дело, что этот способ в общем случае неэффективен из-за затрат на создание копии массива
не массива, а объекта...
Offline
#13 30.10.06 22:38
Re: Вопрос в С++ про класса пямяти.
Укроп написал(а):
керакл хитренький массивы в функции передает ))
эээээ... господа хорошие.... вы меня, конечно, извините, но где вы тут передачу массива узрели??? передается только указатель.
Fatboy собсна, уже написал, как это проверить.
и кстати,
Gerakl написал(а):
Почему класс памяти "static void matrix_print" не допускается?
VS 6.0 допускает.
Offline
#14 30.10.06 23:43
Re: Вопрос в С++ про класса пямяти.
Mozg_RUS написал(а):
про., он имеет ввиду классы памяти (extern,auto,static,register).
Укроп, не говори, я вообще всю жизнь думал, что массивы можно передавать только по адресу, а размерности передавать отдельными параметрами. А вон как все просто.
Gerakl, допускается, только зачем? У тебя просто фигурной скобки не хватает, после
result[row][col]+=
matrix1[row][element]*matrix2[element][col];
поставь ещё одну '}'. А после return(0); "};" убери.
Результат должен быть
11072 12627 16262
3157 3664 5034
13605 16307 22366
а эта прога получилось совсем другой результат. :(
Offline
#15 30.10.06 23:47
Re: Вопрос в С++ про класса пямяти.
Andron_ написал(а):
Укроп написал(а):
керакл хитренький массивы в функции передает ))
эээээ... господа хорошие.... вы меня, конечно, извините, но где вы тут передачу массива узрели??? передается только указатель.
Fatboy собсна, уже написал, как это проверить.
и кстати,Gerakl написал(а):
Почему класс памяти "static void matrix_print" не допускается?
VS 6.0 допускает.
я в Borland C++ 3.1 for Dos.
Offline
#16 31.10.06 03:05
Re: Вопрос в С++ про класса пямяти.
Gerakl написал(а):
я в Borland C++ 3.1 for Dos
здесь разницы особой нет, ибо спецификатор static даже в Си-без-всяких-плюсов присутствовал.. в твоём случае виновата ошибка в синтаксисе.
А вообще совет тебе - выкинь свой компилятор на свалку истории, поставь хотя бы Borland C++ 5.02. А если 16-битные приложения вообще не собираешься писать, то ставь "человеческий" компилятор: Visual C++ или C++ Builder
Offline
#17 31.10.06 19:04
Re: Вопрос в С++ про класса пямяти.
C++ Builder блин более "человеческого" компилятора не видел! Простое приложение типа Hello World весит почти 200 Kb. Если формы и окошки то приятно делать, а что-то писать - извините. Сам начинал на C++ Visual Studio 6.0 очень простой как табуретка и функциональный вдобавок. Если сильно реальное и понтовое программить тогда .NET 2003 или 2005 Enterprise. Тока там сам черт ногу сломит. Я еще не видел человека, который все там юзал. Хотя интерфейс приятный, да и возможности почти безграничные...
Offline
#18 01.11.06 00:19
#19 01.11.06 00:41
Re: Вопрос в С++ про класса пямяти.
Укроп, открываем книжку "Язык Си" Кернигана и Ричи (между прочим авторы языка!), глава 4.6 "Статические переменные" и видим:
Нормально функции являются внешними объектами, их имена известны глобально. Возможно, однако, объявить функцию как STATIС, тогда ее имя становится неизвестным вне файла, в котором оно описано. В языке "C" "STATIC" отражает не только постоянство, но и степень того, что можно назвать "приватностью". Внутренние статические объекты определены только внутри одной функции, внешние статические объекты (переменные или функции) определены только внутри того исходного файла, где они появляются, и их имена не вступают в конфликт с такими же именами переменных и функций из других файлов.
:)
Offline
#20 02.11.06 02:01
Re: Вопрос в С++ про класса пямяти.
надо просто убрать дурацкий static, зачем он вообще. Можно приписать куда угодно, на тогда в настройках префиксы всех функций надо поменять с _cdecl на __fastcall, да и вроде если использовать vector или bus [ namespace vector ] можно без заморочек в любом файле сделать static функцию, а когда она нужна - писать system::vector::[ функция ] и никаких притензий от компилятора.
Offline

