КИТА unofficial

Компьютерный => Программирование => Тема начата: TARAKAN от Ноябрь 25, 2007, 10:02:40



Название: Вопросы в С/С++
Отправлено: TARAKAN от Ноябрь 25, 2007, 10:02:40
Код:
Loaded 'ntdll.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.
Loaded 'G:\Program Files\Agnitum\Outpost Firewall\wl_hook.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\user32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\gdi32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\advapi32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\rpcrt4.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\imm32.dll', no matching symbolic information found.
Как исправить ? Переставить ОС не выход из ситуации =\


З.Ы. Темы по типу такой как я создал не нашел.
(Отправлено в: Ноября 25, 2007, 18:48:11)

 Код любой ... пробывал даже
просто
Код: (cpp)
#include<stdio.h>
void main (){
printf("dwdaww");
}
выдает ошибку эту
(Отправлено в: Ноября 25, 2007, 19:28:17)

 Microsoft Visual C++ 6.0
ХП Проф СП2
(Отправлено в: Ноября 25, 2007, 19:44:47)
 

Просто все нормально работало, ничего не делал с этими файлами, а начало выдавать ошибку =\
От чего может такое произойти ? На будущее просто чтоб знать ...

(Отправлено в: 25 Ноября 2007, 19:10:02)

Код: (c)
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
float *max(float *mas,int n,float sred){
int i,j;
float max,maxo,*a;
           //всякие вычисления, потом
           *a=max;
return (a);
}

void main (){
float *mas,*a,sred,max,imax,jmax;
int i,j,n;
printf("vvedite n\n");
scanf("%d",&n);
create(&mas,n);
sred=sredarif(mas,n);
[color=red]a=max(mas,n,sred);[/color]
}

Цитировать
G:\Prog\lab\04\04.CPP(58) : error C2064: term does not evaluate to a function
Ругается на строчку выделеную. Программа не полная, удалил функции, которые на 100% правильные, чтоб сильно большой не была.
Написал программу поменьше для проверки перд этим, но без передачи данных.
Код: (c)
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
float *qwe(){
  float *a,max=10;
  *a=max;
return(a);
}
void main (){
float *a,n1;
a=qwe();
n1=*a;
printf("%f",n1);
}
Она работает.
Не пойму в чем ошибка ...


Название: Re: Вопросы в С/С++
Отправлено: Polyakov от Ноябрь 25, 2007, 10:46:02
Код: (cpp)
float *max(float *mas,int n,float sred){
   int i,j;
   float max,maxo,*a;
           //Some calculus, then
           *a=max;
return (a);
}

Область жизни и видимости локальных переменных обычно программный блок.
Говорю "обычно" потому что С++ посути дела является не совсем стабильным языком, выполнение программного кода которого зависит от многих факторов.
В вашем случае Вы указателю присваиваете адрес локальной переменной
*a=max;
а потом пытаетесь вернуть переменную "а", которая одновременно является и переменной "max", которая по окончанию выполнения программного блока (функции "float *max(float *mas,int n,float sred)" ) автоматически освобождается в памяти ( то есть говоря более понятным Вам языком уничтожается).
Получается что передается то, чего в момент передачи уже нет!!

Кроме того имя функции "*max" и тут же имя описанной переменной в данном программном блоке "float max,"  !!!

Никогда не перестаюшь удивлятся многообразию проявления абсурдных ситуаций которые пропускает компилятор С++.


Название: Re: Вопросы в С/С++
Отправлено: Alder от Ноябрь 25, 2007, 10:59:56
В вашем случае Вы указателю присваиваете адрес локальной переменной
*a=max;
а потом пытаетесь вернуть переменную "а", которая одновременно является и переменной "max", которая по окончанию выполнения программного блока (функции "float *max(float *mas,int n,float sred)" ) автоматически освобождается в памяти ( то есть говоря более понятным Вам языком уничтожается).
Получается что передается то, чего в момент передачи уже нет!!
Бред! Оператор return затем и используется, чтобы вернуть значение из функции. Он копирует значение переменной а в область памяти, отведенную для возвращаемого результата функцией max.

Никогда не перестаюшь удивлятся многообразию проявления абсурдных ситуаций которые пропускает компилятор С++.
Потому что в языке С/С++ головой должен думать программист, когда пишет небезопасный или непонятно как работающий код.

Говорю "обычно" потому что С++ посути дела является не совсем стабильным языком, выполнение программного кода
Язык на котором написаны ОС для военных компьютеров является не совсем стабильным? Язык, который является основным в мире системного программирования и на нем пишут даже под микроконтроллеры с 512 байт памяти является не совсем стабильным? Я удивлен.


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Ноябрь 25, 2007, 11:05:02
Polyakov
С название функции действительно не заметил  ::)
Идея состояла в том, что если структуры нельзя использовать, а надо передать сразу несколько значений из функции, записать переменные в область памяти на которую ссылается указатель...
т е чтото типа такого
Код: (cpp)
*a=i;
a++;
*a=j;
a++;
*a=*(mas+i*n+j);
потом передать указатель обратно в программу....

С этим разобрался ... работает, коректно или нет попоже проверю вручную :)


Вот еще проблема появилась
Код: (cpp)
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
Код: (cpp)
void create(float **mas, int n) {
int i,j;
*mas=(float*)malloc(n*n*sizeof(float));
randomize ();
for (i=0;i<n;i++)
{ printf("\n");
    for (j=0;j<n;j++)
    {
      *(*mas+i*n+j)=random(2001)-1000;
      printf("%.2f ",*(*mas+i*n+j));
    }
}

}
Цитировать
G:\Prog\lab\04\04.CPP(8 ) : error C2065: 'randomize' : undeclared identifier
G:\Prog\lab\04\04.CPP(13) : error C2065: 'random' : undeclared identifier

Почему может не работать рандом ?  ???


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Ноябрь 25, 2007, 11:08:21
Polyakov, ошибка не в этом. Если в том месте, где стоит непонятный комментарий //а здесь всякие вычисления, будет корректно отводиться память под указатель * a, то присваивание разыменованному указателю и возврат return'ом его копии совершенно правомерен, что сказал Alder.

Что касается "абсурдных" ситуаций, то это не относится к данному случаю. Никто и ничто не мешает объявить внутри функции одноименную переменную. Но в результате мы не сможем использвать рекурсию, так как имя функции будет перекрыто и недоступно. Это нехорошо, программиста надо "бить по рукам" и учить, но это не ошибка.

А вот в функции main() переменная с именем max перекрыла функцию max(). И зря вы ругаете компилятор, он это не пропустил, о чем свидетельствует ошибка Visuall C++ C2064.


Название: Re: Вопросы в С/С++
Отправлено: Alder от Ноябрь 25, 2007, 11:10:37
TARAKAN, undeclared identifier = неописано. Т.е. не может найти описание этой функции в подключенных модулях.

З.Ы. RTFM :)
З.Ы.Ы. Оформляй код правильно! Уже предупреждали.


Название: Re: Вопросы в С/С++
Отправлено: Polyakov от Ноябрь 25, 2007, 11:16:07
Бред! Оператор return затем и используется, чтобы вернуть значение из функции. Он копирует значение переменной а в область памяти, отведенную для возвращаемого результата функцией max

Правильно копирует значение переменной, а в переменной "а" находится указатель адреса.
Интересно какая у Вас была оценка по программированию?


(Отправлено в: 25 Ноября 2007, 22:10:50)


Polyakov, ошибка не в этом. Если в том месте, где стоит непонятный комментарий //а здесь всякие вычисления, будет корректно отводиться память под указатель * a, то присваивание разыменованному указателю и возврат return'ом его копии совершенно правомерен, что сказал Alder.

В примере явно присутствует строчка

          *a=max;

Поэтому о корректном выделении памяти под переменную "а" при данных примера нет и речи. А Alder пусть как говорят немного подучит матчасть.


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Ноябрь 25, 2007, 11:25:15
Alder
Я понимаю, что неописанно, но рандом хранится в библиотеке stdlib.h она подключена
#include<stdlib.h>
у меня уже такое не первый раз ... иногда работает иногда нет

Оформляй код правильно! Уже предупреждали.
Пока печатал новое сообщение отправили новое, последнее поправил, остальные ввиду запрета на правку по времени, сам не могу поправить, Романыч сказал, что поправит, и это сделал : ))






Создал *а в программе и передал в функцию, вроде работает правильно.


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Ноябрь 25, 2007, 11:28:34
TARAKAN, ты используешь Visual C++, а в нем генерация случайных чисел не такая, как в старом досовском Turbo C или Borland C++. И функций randomize() и random() в stdlib.h этой среды нет, ибо они не относятся к кроссплатформенным. Так что меняя ОС и компилятор будь готов к тому, что их нет. Используй в VC++ функции void srand(unsigned int seed) и int rand(). Что-то вроде этого:

Код: (cpp)
#include <stdlib.h>
#include <time.h>
...
int main(void) {
  // Инициализируем генератор
  srand((unsigned) time(NULL));

  /* Генерируем случайное число
  от 0 до RAND_MAX (по умолчанию от 0 до 32767)
  */
  int randomNumber = rand();

}

Деля результат rand() на (double)RAND_MAX, можно нормализовать случайное число к 1, а затем поулчить число в нужном диапазоне. Дальше - сам... Тут хороший пример: http://msdn2.microsoft.com/en-us/library/398ax69y(VS.80).aspx

И вообще, если решил использовать для учебы изначально VC++, поставь и подружись с MSDN. И будет тебе счастье. Может быть :D


Название: Re: Вопросы в С/С++
Отправлено: Polyakov от Ноябрь 25, 2007, 11:41:13

Язык на котором написаны ОС для военных компьютеров является не совсем стабильным? Язык, который является основным в мире системного программирования и на нем пишут даже под микроконтроллеры с 512 байт памяти является не совсем стабильным? Я удивлен.

Приготовьтесь к тому что в своей жизне Вам еще предстоит многому удивляться!
Ведь недаром говорят "исскуство программирования". Одним это дано, другим нет. Одни мастера, другие - в лучшем случае подмастерья.

Профессиональное программирование на С есть исскуство, потому что в данном семействе языков программирования имеется наибольшее количество подводных камней и реальное программирование здесь осуществляется что называется на гране фола. Зато если этим исскуством овладеть хотя бы близко к профессиональному уровню то программки получаются компактные, быстрые, но часто узконаправленные. За одни свойства нужно расплачиваться другими.

(Отправлено в: 25 Ноября 2007, 22:38:15)


TARAKAN, ты используешь Visual C++, а в нем генерация случайных чисел не такая, как в старом досовском Turbo C или Borland C++. И функций randomize() и random() в stdlib.h этой среды нет, ибо они не относятся к кроссплатформенным. Так что меняя ОС и компилятор будь готов к тому, что их нет. Используй в VC++ функции void srand(unsigned int seed) и int rand().

А если преподаватель попросит запустить данную программу, а VC++ в аудитории и не пахнет? Что тогда будем делать?


Название: Re: Вопросы в С/С++
Отправлено: Alder от Ноябрь 25, 2007, 11:42:48
Правильно копирует значение переменной, а в переменной "а" находится указатель адреса.
А это что-то меняет? Функции, возвращающие указатель, ничем не отличаются от функций, возвращающих обычные переменные. Единственный нюанс - тип возвращаемого указателя должен соответствовать типу, описанному в заголовке функции (ну и память само собой должна быть грамотно выделена, что верно сказал EvilMax) То, что TARAKAN не описал это выделение не означает, что так нельзя делать.

Интересно какая у Вас была оценка по программированию?
Если вас это так интересует, то 4.

А Alder пусть как говорят немного подучит матчасть.
Матчасть я привел правильно с учетом нюансов выделения памяти. По стандарту (жаль, не нашел полный стандарт С, но вполне сгодился справочник Шилдта для подтверждения того, что я знал) все будет так, как я написал выше.


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Ноябрь 25, 2007, 11:43:40
Ясно, буду разбираться, просто не понравилась старая версия тем что там скопировать результат с экрана неполучается.... а в одной задаче матрица вышла за пределы экрана... а вариант изменять программу для записи результатов в текстовик не подошла т к нас этому просто еще не обучали....


Я так понял, что без MSDN мне не обойтись уж точно, буду качать ...
Цитировать
Может
Хорошое слово :D


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Ноябрь 25, 2007, 11:46:39
Off-Topic - помечено автором как "не соответствует обсуждаемой теме"
Программирование - не искусство. Это средство зарабатывания денег, ИМХО. Хотя, когда изучаешь какой-то раздел, хорошо бы к нему относиться как к искусству, быстрее научишься писать красивый и компактный код. Да и вырабатывается привычка хоть чуть-чуть оптимизировать его сразу, а не постфактум.

Что касается военных систем, я слышал замечания по поводу процессов разработки таких систем на C от друга, работающего в США. Детально изучаются все возможные и уже найденные ошибки и нестабильности компилятора. Потом пиештся код. А потом пишется _на порядок_ больше документации _только к коду_. Т.е. функция на пол-экрана может обрости несколькими страницами пояснений и примеров.

А вообще, смотрим название темы и не оффтопим. Если нужно обсудить достоинства, недостатки C/C++ и стабильность компиляторов, начните новую тему.


Название: Re: Вопросы в С/С++
Отправлено: Polyakov от Ноябрь 25, 2007, 11:57:23
А это что-то меняет? Функции, возвращающие указатель, ничем не отличаются от функций, возвращающих обычные переменные. Единственный нюанс - тип возвращаемого указателя должен соответствовать типу, описанному в заголовке функции (ну и память само собой должна быть грамотно выделена, что верно сказал EvilMax) То, что TARAKAN не описал это выделение не означает, что так нельзя делать.

Возвращает - да.
Возвращает указатель на ту, область памяти которая уже не доступна.

То, что TARAKAN не описал это выделение не означает, что так нельзя делать.
Можно и на потолке спать - да одеяло на пол падать будет.


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Ноябрь 26, 2007, 12:01:11
Возвращает указатель на ту, область памяти которая уже не доступна.

Если память выделена malloc или ей подобной функцией, то все будет нормально. Ведь выход из функции не освобождает специально выделенную память. *a=max; - тоже корректно, разыменовали и в выделенную память записали float. Потом вернули копию адреса.

Если бы было a = &max;,  то тогда да, была бы ошибка. Так как float max имеет внутри функции класс памяти auto и эта память будет освобождена. Но в коде такого нет.


Название: Re: Вопросы в С/С++
Отправлено: Polyakov от Ноябрь 26, 2007, 12:16:54
Так как float max имеет внутри функции класс памяти auto и эта память будет освобождена. Но в коде такого нет.
Как это "в коде такого нет"?
Код: (cpp)
float *max(float *mas,int n,float sred){
int i,j;
float max,maxo,*a;
          //всякие вычисления, потом
          *a=max;
return (a);
}


Название: Re: Вопросы в С/С++
Отправлено: Alder от Ноябрь 26, 2007, 12:20:25
Polyakov, имелось ввиду вот это - "Если бы было a = &max;,  то тогда да, была бы ошибка." В коде такого действительно нет.


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Ноябрь 26, 2007, 12:23:50
Polyakov, я не вижу взятия адреса локальной переменной. Разыменование указателя, под который не отведена память есть, это ошибка. А то, о чем вы говорили, нет. Смотрим подробно:
Код: (cpp)
float *max(float *mas,int n,float sred){
   int i,j;
   float max,maxo,*a;
          //всякие вычисления, потом

   /* Разыменовываем указатель
      и записываем в память значение типа float
      Это абсолютно корректно, если до этого где-то встретися a=(float*)malloc(sizeof(float));
      Иначе - разыменовываем "мусор". И пишем данные "в космос". В Windows и Unix программа здесь должна "вылететь"
   */
   *a=max;
   // Возвращаем копию адреса в программу. Все ОК, если указатель корректный
   return (a);
}

То же, о чем говорите вы, и что касается уничтожения локальных переменных при выходе было бы так:

Код: (cpp)
  float max,maxo,*a;
  a=&max; // Некорректно! max будет уничтожена при выходе!
  return a;

Но этого нет.


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Ноябрь 26, 2007, 12:34:41
Off-Topic - помечено автором как "не соответствует обсуждаемой теме"
Никто ничего не перекрывает. Заметьте, ни вас никого другого ограничивать никто не собирается. Речь идет об элементарном уважении форумчан. Здесь преподаватель на равных со студентом. Что же касается предупреждений:
- код нужно оформлять. В быстром написании этиго инструмента нет, но если нажать на "Ответ" - там есть варианты оформления кодя для многих языков программирования.
- флуд - вместо обсуждения вопроса, начали выяснять, у кого что по программированию, рассуждать  стабильности компиляторов и т.п. Надо хотя бы пользоваться тегом offtop для этого (см. это сообщение)

А в целом, думаю, в этом споре какая-то истина родилась, посему общение оказалось небесполезным.

Модератор(ы) и форумчане, если вопрос, заданный TARAKAN  исчерпан, предлагаю данную тему закрыть.
Возражения есть?


Название: Re: Вопросы в С/С++
Отправлено: Alder от Ноябрь 26, 2007, 12:43:50
Off-Topic - помечено автором как "не соответствует обсуждаемой теме"
А мне и не надо с Вами выяснять кто умнее. Кто есть кто мы и так знаем. Если кому-то не нравятся мои ответы на вопросы некоторых из участников форума, то это их личное дело.
Дело не в том - нравятся или нет, а в уважении к собеседнику.

Это вполне естественно, но как у нас говорят прав тот у кого больше прав.
Своими правами мы не злоупотребляем!

Вы можете перекрыть мне вход на форум
Если говорить прямо, то есть все основания это сделать. На данный момент вы нарушили 3 пункта правил форума:
п.6 Правил раздела "Программирование" - 6. Оформление кода
п. 3.3.3. Общих правил форума - 3.3.3. Чрезмерный оффтопик
п.1 Правил раздела "Программирование" - 1. Общие положения  "Уважайте друг друга."

Но у нас лояльный админо-модерский состав, поэтому рекомендуем вам ознакомится с Правилами форума, а также с правилами тех разделов, в которых оставляете сообщения. Точно также как в каждой стране есть свои законы, так есть законы и на нашем форуме и их нужно соблюдать.

Любой ответ на это сообщение будет удален без объяснения как оффтопик! Отныне пишем только в рамках темы. Если есть претензии - мне в ЛС.



Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Декабрь 02, 2007, 06:02:55
Код: (cpp)
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
void main () {
long float s,x,st,y;
int k;

for (x=0;x<=M_PI/3.;x=x+M_PI/24.)
{
  k=0; s=0; st=pow(10,15);
  while(st>=pow(10,-5))
  {
    st=fabs((-pow(3,2*k+1)*x)/(pow(3,2*k)-3));
    s=s+st;
    k=k+1;
  }
 y=pow(sin(x),7);
 s=s/4.;

    printf("x=%f   k=%d   s=%f   y=%f\n",x,k,s,y);
}
}
Код:
pow: OVERFLOW error
14-я строка
OVERFLOW - переполнение, хотя первое значение к=0, т е возводит в степень 1 и 0, те получается 3 и 1, как тут может быть переполнение ?


Название: Re: Вопросы в С/С++
Отправлено: Alder от Декабрь 02, 2007, 06:18:13
TARAKAN, у тебя просто условие цикла выполняется всегда. Возьми дебаггером проверь - на первых шагах все нормально. А потом к становится равным что-то в районе 12000, просто на современных компах все очень быстро считается :)

Вот тебе немного модифицировання программа для отладки. Для вывода следующей строки нажимай любую клавишу. Ты увидишь, что вначале все вычисляется правильно :)
Код: (cpp)
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
void main () {

long float s,x,st,y;
int k;

for (x=0;x<=M_PI/3.;x=x+M_PI/24.)
{
k=0; s=0; st=pow(10,15);
while(st>=pow(10,-5))
{
st=fabs((-pow(3,2*k+1)*x)/(pow(3,2*k)-3));
s=s+st;
printf("k=%d   st=%f   s=%f   \n",k,st,s);
getch();
k=k+1;
}
y=pow(sin(x),7);
s=s/4.;
printf("x=%f   k=%d   s=%f   y=%f\n",x,k,s,y);
}
}


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Декабрь 02, 2007, 06:39:34
Alder
Тогда я запутался ...
у меня было
st=fabs(pow(-1,k+1)*(pow(3,2*k+1)-3)*pow(x,2*k+1)/fact(2*k+1));
но видетели им не нравится факториал в знаменателе, надо вывести рекурентную формулу, вывел рекурентную формулу ... нашел в ней ошибку только что (в знаменателе 2*k+2 еще), но дела не меняет ошибка в pow все равно ...
st=fabs((-pow(3,2*k+1)*x)/((pow(3,2*k)-3)*(2*k+2)));
и что с ней делать ? засунул вместо 1-го, но теперь выдает эту ошибку... и что делать тогда ?  =\


Название: Re: Вопросы в С/С++
Отправлено: Alder от Декабрь 02, 2007, 06:52:55
TARAKAN, скорее всего ошибка в формуле. Почему ошибка в pow я тебе уже написал - происходит переполнение при значениях к в районе 10000 и более. Как вариант - можешь выразить степень через логарифм, но тогда усложнишь выражение. Внимательнее просмотри формулу - может неправильно вывел рекурентное соотношение.


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Декабрь 02, 2007, 07:12:12
Так-с похоже целый день делать д/з это нехорошо ... банальная описка ... в самой программе ... (нашел старые бумажке где выводил формулу) ... голова совсем не работает ...
Код: (cpp)
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
void main () {
long float s,x,st,y;
int k;


for (x=0;x<=M_PI/3.;x=x+M_PI/24.)
{
  k=0; s=0; st=pow(10,15);
  while(st>=pow(10,-5))
  {
    st=fabs(((-pow(3,2*k+1)-1)*x)/((pow(3,2*k)-1)*(2*k+2)));
    s=s+st;
    k=k+1;
  }
 y=pow(sin(x),7);
 s=s/4.;

    printf("x=%f   k=%d   s=%f   y=%f\n",x,k,s,y);
}
}
Выдает ошибку (прикрепил к сообщению) ... ??? ... значения там должны быть очень маленькими в функции ...


Название: Re: Вопросы в С/С++
Отправлено: Alder от Декабрь 02, 2007, 07:18:05
TARAKAN, пишет "Квадратный корень из отрицательного числа". Но именно корня я у тебя не вижу в программе. Может с расстановкой скобок напутал?

З.Ы. Используй старый добрый Borland C++ 3.1 :) Это совет.


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Декабрь 02, 2007, 07:54:16
Alder
Переписал всю программу нашел кучу ошибок ... ну это исправил ... тут проблема получше нашлась ...
При первом шаге у нас x=0 и k=0
и получается такая вещ...
Код: (cpp)
st=fabs( -((pow(3,2*k)-1)*(2*k+2)) / (x*(pow(3,2*k+1)-1))  );
В числителе 0 и в знаменателе 0 ... в знаменателе все исправляется если сделать шаг не с 0 а с M_PI/24. , но вот в числителе ... если поставить степень 2k+1 (или любую другую) то вылетает ошибка с pow, а если оставить так как есть получается что st< точности и выходим из цикла ...
Посмотрел все с самого начала ... условие верное ...
Ладно ... принесу завтра на проверку, посмотрю еще раз в методичке условие (хотя сомневаюсь, что условие неправилньо записал) ... и если совпадет интересно, что скажет на это Александр Иванович =\

З.Ы. В нем и делаю сейчас ...


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Декабрь 03, 2007, 12:42:30
LazarusLong
Ясно, спс, уточню задание всетаки завтра и тогда доделаю.


Сижу разбираюсь с методом быстрой сортировки ... в целых числах все нормально работает
Код: (cpp)
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
void sort(int *mas, long n) {
  long i=0, j=n;
  int t,p;
  int sr;
  sr=(int)floor(n/2.);
  p = mas[sr];
  do {
    while ( mas[i]<p) i++;
    while ( mas[j]>p) j--;

    if (i <= j) {
      t=mas[i];
      mas[i]=mas[j];
      mas[j]= t;
      i++; j--;
    }
  } while ( i<=j );
  if ( j > 0 ) sort(mas, j);
  if ( n > i ) sort(mas+i, n-i);
}

void main () {
int i,j,n;
int mas[20];
randomize();
do {
printf("vvedite n\n");
scanf("%d",&n);
}
while(n>19);
for(i=0;i<n;i++)
{
  mas[i]=random(101);
  printf("%d   ",mas[i]);
}
printf("\n\n\n");
sort(&mas[0],n);
for(i=0;i<n;i++)
{
  printf("%d   ",mas[i]);
}
}
Но когда пытаюсь переделать все на вещественные 1-й эл-т равен 0, а максимального эл-та после сортировки вобще нету, те сортировка идет, только сбивается указатель и значения заносятся не в ту область памяти что надо, а на +1 больше и потом при выводе получется что 1-й эл-т не заполнялся (т е равен 0), а последний мы не вывели, т к он записан на 1 ячейку дальше чем надо. (эксперементально проверил, что так оно и есть, эл-ты записываются в ячейки не i, а i+1, и последний выходит за границу). Прикрепил скрин результата, если выводить значения на 1 ячейку дальше чем занимает массив, на нем как раз видел сдвиг этот ....
Конечно можно сделать так чтобы выводило результат корректно, но почему с целыми нормалньо все, а в вещественных сдвигается =\
Код: (cpp)
#include<conio.h>
#include<math.h>
#include<stdlib.h>
void sort(float *mas, long n) {
  long i=0, j=n;
  float t,p;
  int sr;
  sr=(int)floor(n/2.);
  p = mas[sr];
  do {
    while ( mas[i]<p) i++;
    while ( mas[j]>p) j--;

    if (i <= j) {
      t=mas[i];
      mas[i]=mas[j];
      mas[j]= t;
      i++; j--;
    }
  } while ( i<=j );
  if ( j > 0 ) sort(mas, j);
  if ( n > i ) sort(mas+i, n-i);
}

void main () {
int i,j,n;
float mas[20];
randomize();
do {
printf("vvedite n\n");
scanf("%d",&n);
}
while(n>19);
for(i=0;i<n;i++)
{
  mas[i]=(float)random(10100)/100;
  printf("%.2f   ",mas[i]);
}
printf("\n\n\n");
sort(&mas[0],n);
for(i=0;i<n;i++)
{
  printf("%.2f   ",mas[i]);
}
}


Название: Re: Вопросы в С/С++
Отправлено: Archangel от Декабрь 22, 2007, 01:09:25
Задание:
Разработать программу для управления светодиодами в строке. При нажатии/отпускании кнопки соответствующие светодиоды мигают с частотой 0,5 Гц, при повторном нажатии/отпускании - гаснут.
Кнопки:
4 - 1, 2 светодиоды
3 - 3, 4
2 - 5, 6
1 - 7, 8
1 светодиод соответствует младшему биту.
КОД:
Код: (c)
#include <stdio.h>
#include <sys/io.h>

int
main()
{
int flag[4], i, mask[3], toport;
flag[0]=flag[1]=flag[2]=flag[3]=1;
mask[1]=0x20; mask[2]=0x10; mask[3]=0x8;
char button, button_new;
if(ioperm(0x378,3,1)==-1)
{
printf("Can't get access to i/o ports!\n");
_exit(1);
}
for(;;)
{
button=inb(0x379);
usleep(20000);
button_new=inb(0x379);
if(button==button_new)
{
if(button&0x80==1)
flag[0]=-flag[0];
for(i=0;i<4;i++)
{
if(button&mask[i]==0)
flag[i]=-flag[i];
}
}
if(flag[0]<0)
toport=toport+192;
else
toport=toport&252;
for(i=0;i<4;i++)
{
if(flag[i]<0)
toport=toport|3<<(2*i);
else
toport=toport&(~(3<<(2*i))&255);
}
outb(toport, 0x378);
sleep(1);
toport=0;
outb(toport, 0x378);
usleep(980000);
}
ioperm(0x378,3,0);
return 0;
}

Проблема с считыванием нажатой кнопки, кнопки подключены к LPT к выводам 15,13,12,11, указаным на рисунке. Стенд на других лабах работает, на него грешить не получается. Но почему то у меня по нажатию кнопки ничего не происходит, ни на одну кнопку не реагирует. На сколько я понял проблема в первых 30 строках, но не могу понять где имено?
ЗЫ И еще маленький бок почему-то на после выполнения первых строк 20, flag[0]=8, не сильно мешает, но с чего ???
(http://D:/Порт.jpg)


Название: Re: Вопросы в С/С++
Отправлено: Archangel от Декабрь 23, 2007, 06:53:51
Тут с товарищем некоторые ошибки, но они не решают поставленных вопросов:
23 и 35 строки i=1(вместо i=0).
34 строка toport&63(вместо toport&252)

(Отправлено в: 22 Декабря 2007, 01:00:47)

Чего то все притихли, неужели никто не в курсе?


Название: Re: Вопросы в С/С++
Отправлено: Storm от Декабрь 24, 2007, 08:43:25
toport в тип char, компиляция с ключом -O2


Название: Re: Вопросы в С/С++
Отправлено: Archangel от Декабрь 24, 2007, 12:11:15
Я то конечно попробую, только как toport повлияет на ввод, у меня с выводом проблем не было, а вот со вводом ...

Дальнейшее обсуждение в ЛС
Романыч


Название: Re: Вопросы в С/С++
Отправлено: Артем от Март 03, 2008, 06:25:25
Здравствуйте, у меня такой вопрос, если у меня есть к примеру 2 объекта, один из них относиться к классу "Матрица", второй к классу "Вектор". 2-ой объект, относящийся к классу "Вектор" являеться полем 1-ого объекта "Матрица", то есть получаеться "класс в классе", как обратиться к методам объекта "Вектор", который в свою очередь являеться свойством 1-ого объекта "Матрица" ???
 


Название: Re: Вопросы в С/С++
Отправлено: Sochin от Март 03, 2008, 06:46:59
Матрица.Вектор.Метод();


Название: Re: Вопросы в С/С++
Отправлено: Артем от Март 03, 2008, 10:45:53
Объясните пожалуйста, в каких случаях при использовании ссылочных аргументов в функции, компилятор создает временные переменные, а в каких нет ??? Заранее благодарен за ответ !  :)


Название: Re: Вопросы в С/С++
Отправлено: Артем от Март 05, 2008, 09:38:47
Мне нужно создать динамический массив объектов, и сделать это нужно с помощью конструктора с параметром. Но ведь в С++ НЕЛЬЗЯ СОЗДАТЬ ДИНАМИЧЕСКИЙ МАССИВ ОБЪЕКТОВ С ПОМОЩЬЮ КОНСТРУКТОРА С ПАРАМЕТРАМИ. Как это сделать ???? Некоторые соображения у меня есть, но не знаю насколько они правильны. Если есть какие-нибудь предложения то пишите. Заранее спасибо !!!  :)

Код: (cpp)
class vektor
  {
    private:
      int sizeX;
      float *X;

    public:
      vektor(int size);
     ~vektor();
      void printVektor()const;
  };

vektor::vektor(int size): sizeX(size)
  {
    X=new float[sizeX];
    cout<<endl<<"Created VEKTOR !!!";
  }

vektor::~vektor()
  {
    delete X;
    cout<<endl<<"Destroyed VEKTOR !!!";
  }

class matrix
  {                               
    private:
      int m,n;
      vektor *X[];

    public:
      matrix(int sizeM,int sizeN);
     ~matrix();
      void printMatrix()const;
  };

matrix::matrix(int sizeM,int sizeN): m(sizeM),n(sizeN)   //этот конструктор с параметрами меня и волнует, правильно ли я выделил память под массив объектов ???
  {
    int i;
    for(i=0;i<m;i++)
      {
        *(X+i)=new vektor(n);
      }
    cout<<endl<<"Created MATRIX !!!";
  }

matrix::~matrix()
  {
    delete[]X;
    cout<<endl<<"Destroyed MATRIX !!!";
  }


Название: Re: Вопросы в С/С++
Отправлено: LazarusLong от Март 05, 2008, 09:57:32
Вот тебе два примера кода
Код: (cpp)
        
void swap ( int & x, int & y)
{
     int z=y;
     y=x;
     x=z;
}

main()
{
     int a=3, b=5;
     swap(a,b);
     return 0;
}


Код: (cpp)
        
void swap ( int & x, int & y)
{
     int z=y;
     y=x;
     x=z;
}

main()
{
     float a=3, b=5;
     swap(a,b);
     return 0;
}

В первом случае переменные не будут создаваться. Во втором - будут. Почему - думай сам :)


Название: Re: Вопросы в С/С++
Отправлено: Артем от Март 05, 2008, 10:00:34
Ну там в 1-ом случае все НОРМ, а во 2-ом НЕСООТВЕТСТВИЕ ТИПОВ ДАННЫХ!!!

А разве я в своем коде где-то напортачил с типами ?????


Название: Re: Вопросы в С/С++
Отправлено: LazarusLong от Март 05, 2008, 10:05:28
artem90, я не знаю. Ты задал вопрос. Я тебе привел в ответ пример. Вот тебе дословно цитата из книги

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


Название: Re: Вопросы в С/С++
Отправлено: Артем от Март 05, 2008, 10:08:26
LazarusLong, спасибо за ответ!!! я сразу не понял, на какой вопрос ты ответил!!! я со ссылками уже разобрался, я подумал что ты на счет выделения памяти под массив динамических объектов хотел сказать !!!


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Март 06, 2008, 12:44:55
artem90, описание массива векторов в матрице не годится. Надо vektor **X. С соответствующей модификацией конструктора матрицы с параметрами. Там внутри кое-что придется добавить ;) Деструктор матрицы, соответственно, тоже усложнится.


Название: Re: Вопросы в С/С++
Отправлено: vimmax от Март 06, 2008, 05:57:23
artem90 Значит так:
Ошибки:
1.
Код:
cout<<endl<<"Destroyed MATRIX !!!";
пиши так:
Код:
cout<<"Destroyed MATRIX !!!"<<endl;
Потому, что в текст помещается в буффер, но не выводится сразу на консоль. Чтобы вытолкнуть текст из буффера в поток надо или endl или команда flush(). Удобнее ставить endl в конце. Получается при дебаге текст должен печататься на экране, но реально его нету - он лежит в буфере ))
2.
Делай конструктор по-умолчанию, без параметров. Он все равно нужен. И добавь метод Init() для дополнительной инициализации. Типа:
Код: (cpp)
class vektor
 {
   private:
     int sizeX;
     float *X;
 
   public:
    vektor(int size);
    vektor() { X=NULL; sizeX=0; cout<<"VEKTOR def"<<endl; };
    ~vektor();
    void printVektor()const;
void Init(int size);
};
 
vektor::vektor(int size): sizeX(size) {
   X=new float[sizeX];
   cout<<"Created VEKTOR !!!"<<endl;
}
 
vektor::~vektor()  {
   if(X != NULL) delete[] X;
   cout<<"Destroyed VEKTOR !!!"<<endl;
}

void vektor::Init(int size) {
sizeX = size;
if(X != NULL) delete[] X;
X=new float[sizeX];
}


Название: Re: Вопросы в С/С++
Отправлено: Артем от Март 06, 2008, 06:06:33
EvilMax, описание массива векторов в матрице не годится. Надо vektor **X. С соответствующей модификацией конструктора матрицы с параметрами. Там внутри кое-что придется добавить  Деструктор матрицы, соответственно, тоже усложнится.

EvilMaxОписание массива векторов в матрице я исправил, но я не совсем понял почему неподходит *X[] - это ведь массив укзаателей, как раз то что мне и нужно (вроде бы  ::)). Деструктор матрицы тоже исправил. А вот с конструктором матрицы никак не соображу, что там надо поменять, вроде и так все работает  :)

Код: (cpp)
class matrix
  {                               
    private:
      int m,n;
      vektor **X;

    public:
      matrix(int sizeM,int sizeN);
     ~matrix();
      void printMatrix()const;
  };

matrix::matrix(int sizeM,int sizeN): m(sizeM),n(sizeN)
  {
    int i;
    for(i=0; i<m; i++)
      {
        *(X+i)=new vektor(n);
      }
    cout<<endl<<"Created MATRIX";
  }

matrix::~matrix()
  {
    int i;
    for(i=0; i<m; i++)
      {
delete *(X+i);
      }
    cout<<endl<<"Destroyed MATRIX";
    getch();
  }



Название: Re: Вопросы в С/С++
Отправлено: vimmax от Март 06, 2008, 06:18:55
3. Указатели сразу инициализируй в NULL (X=NULL) и после delete  обратно присваивай в NULL. Пригодится.

4. Если у тебя есть указатель на массив указателей, то для него все равно надо выделить память на массив указателей (стр. 16), а потом по каждому элементу массива снова выделить память для вектора (стр. 20).
Удаление наоборот: удаляешь элементы - вектора X[ i ], а потом удаляешь память по Х (стр 35 и 39).
Код: (cpp)
class matrix
 {                             
   private:
     int m, n;
     vektor **X;
   public:
     matrix(int sizeM,int sizeN);
    ~matrix();
     void printMatrix()const;
 };

matrix::matrix(int sizeM,int sizeN): m(sizeM),n(sizeN)
 {
int i, j;

X = new vektor* [m];

for(i=0;i<m;i++)
{
       X[i]=new vektor[n] ;
   for(j=0;j<n;j++)
   {
   X[i][j].Init(3);
   }
}

   cout<<"Created MATRIX !!!"<<endl;
 }
 
matrix::~matrix()
 {
int i;
for(i=0;i<m;i++)
{
delete[] X[i];
X[i] = NULL;
}

delete [] X;
X = NULL;

cout<<"Destroyed MATRIX !!!"<<endl;
 }


(Отправлено в: 06 Марта 2008, 17:15:53)

Фух.

Работающий вариант тут:


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Март 07, 2008, 10:15:27
vimmax, да, увы, у тебя ошибка. Кубик получился ;)  Вариант, который сбросил в личку artem90, твоей ошибки не содержит - так что в этот раз обошлось, парень подошел к совету критически.

Polyakov прав в том, что к советам надо относиться осторожно. Советующим - 7 раз отмерь, один отрежь. Тем, кому адресованы советы - относиться к ним критически и проверять. Все мы люди-человеки, а людям свойственно ошибаться.

хз... но в наше время мы рылись по книгам, по инету, по библиотекам, по знакомым... но не получали готовые ответы из инета (форума)....... и что за программисты получатся поле такого развитияНепонимающий
Да, это нехорошо, и вопрос этот поднимался. По-моему, модератор уже как-то отправлял студента из этой тем с вопросом "а что у меня тут не работает?" и совершенно правильно поступал. Поэтому я и не выкладываю полного кода, а ограничиваюсь только общими рекомендациями и консультациями, позволяющими выйти на правильный вариант решения. Был задан вопрос "как это - векторы в матрице?", был дан ответ.

Поэтому просьба к форумчанам: не выкладывайте готовые куски кода лабораторных работ. Например, vimmax мог ограничиться фрагментом кода вроде такого:

Код: (cpp)
class matrix
{
  vector ** rows;
// some other logic
};

matrix::matrix(int m, int n){
  // Create  row array here
  rows = new vector* [m];
  for (int i=0; i<m; i++) {
    // Create each row sized 'n'
    rows[i] = new vector(n);
   // something else
  }
  // some other logic
}


Насчет общей структуры класса, организации деструктора, и к тому же организации вектора и т.п. пусть студент думает сам. А то придет время ему самостоятельно созать класс, а он не сможет даже определить его открытый интерфейс, набор полей и операций...

ЗЫ: просьба относиться к моему посту не как к порицанию или там попытке всех построить - для этого есть модератор раздела, относитесь к нему просто как к дружескому пожеланию. Это, несомненно, даст пользу тем, кто консультируется.


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Март 11, 2008, 05:32:26
Извиняюсь за непонятный символы в коде, не пойму откуда берутся, при редактировании сообщения все время появляются ... думаю понятно и так ...
Код: (cpp)
class matrix
{
  vector ** rows;
// some other logic
};
 
matrix::matrix(int m, int n){
  // Create  row array here
  rows = new vector* [m];
  for (int i=0; i<m; i++) {
    // Create each row sized 'n'
    rows[i] = new vector(n);
   // something else
  }
  // some other logic
}
Соответственно для освобождения памяти надо сделать вот такую вещ ?
Или я чтото путаю ?   :mega_shok:
Код: (cpp)
matrix::~matrix(int m)
{
  for (int i=0; i<m; i++)
  {
     delete rows[i];
  }
  delete []rows;
}


А при таком создании матрицы (как я понял это оно и делает), потом как обращаться к элементам ? просто rows[ i ][ j ] ? или через указатели ?


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Март 11, 2008, 06:05:37
Вопрос в том правильно ли вобще я сделал освобождение памяти ? = ))


Получается обращение будет вот таким (после заполнения)
*(*rows+i*n+j)=123;


Или както подругому ?


Немного запутался ...
rows = new vector* [m];
Мы этим действием задаем кол-во строк или столбцов ? В общем параметр "m" в данном выделении памяти означает строки или столбцы ?


Название: Re: Вопросы в С/С++
Отправлено: vimmax от Март 11, 2008, 06:21:43
TARAKAN  по поводу освобождения памяти - подебажься. Заполни матрицу полностью уникальными значениями (типа 0, 1, ... , n) и проверь, чтоб все значения записались правильно. Если эксцепшенов не случилось - значит нормально. (а с виду правильно)))


Цитировать
Получается обращение будет вот таким (после заполнения)
*(*rows+i*n+j)=123;
Или както подругому ?
Чтобы обращение к элемантам матрицы было человеческим - надо перегрузить operator[] или operator(). И всю работу с указателями организовать внутри.


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Март 11, 2008, 06:32:41
vimmax
Цитировать
Чтобы обращение к элемантам матрицы было человеческим - надо перегрузить operator[] или operator(). И всю работу с указателями организовать внутри.
Немного не понял ... как понять перегрузить ... просто я не пойму вобще разницы между [] и () ...
А внутри чего именно ?


Название: Re: Вопросы в С/С++
Отправлено: vimmax от Март 11, 2008, 06:40:21
TARAKAN внутри класса можно объявлять как методы  класса, так и перегружать операторы.
Например для вектора vector перегрузить оператор operator[].
Чтобы можно было пользоваться:
Код:
vector Foo(10); // создать вектор из 10 элементов
Foo[5] = 3; // третьему элементу вектора присвоить 3
читай инфу.
аналогично operator()


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Март 11, 2008, 07:00:52
В Деструкторе надо сделать цикл, но как туда передать переменную не пойму ... "вводить ее нельзя", а как тогда ?
Допустим есть вот такое ... как передать переменную в деструктор ?
Код: (cpp)
class matrix
{
private:
    int nmas,mmas; 
public:
  double **mas;
  matrix(int n,int m);
  ~matrix();
};
 
matrix::matrix(int n,int m): nmas(n),mmas(m)
{
  int i;
  mas = new double* [nmas];
  for (i=0;i<n;i++)
  {
    mas[i] = new double(mmas);
  }

}

matrix::~matrix()
{
  for (int i=0; i<n; i++)
  {
    delete mas[i];
  }
  delete []mas;
printf("destroyed matrix \n");
}


Название: Re: Вопросы в С/С++
Отправлено: vimmax от Март 11, 2008, 07:09:14
TARAKAN пи-ляя )))
В деструктор нельзя передавать параметры.
Все члены и методы класса видны в деструкторе.
указатели типа double **mas - ненадо делать public.
Т.к. в другом месте программы кто-то может удалить или выделить память по этому указателю.
Вся работа с памятью должна быть скрыта в методах класса.


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Март 11, 2008, 07:18:21
vimmax
Если я правильно понял надо сделать чтото по типу такого
Код: (cpp)
matrix::freemem(int n)
{
  int i;
  for (int i=0; i<n; i++)
  {
    delete mas[i];
  }
  delete []mas;
  printf("\n free memory \n");
}
А деструктор оставить в покое ? = ))


Название: Re: Вопросы в С/С++
Отправлено: Артем от Март 11, 2008, 07:30:57

Получается обращение будет вот таким (после заполнения)
*(*rows+i*n+j)=123;

Так как это массив указателей (2-мерный массив) то обращение  будет выглядеть следующим образом:

*( *(rows + i) + j )

*(rows+i) - это 1-ый элемент i-той строки

*(rows + i) + j - двигаемся от 1-ого элемента i-той строки вправо на j элементов

*( *(rows + i) + j ) - ну и наконец разименовуем

все!


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Март 11, 2008, 07:54:16
Все компилируется без ошибок (даже предупреждений нету, что странно :D )
Но когда запускаю приложение вылетает, а точнее идет выделение памяти, заполнение массива, вывод массива на экран, а потом вылетает с такой ошибкой (прикрепил скрин)


Код: (cpp)
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
class vektor
&#160; {
&#160; &#160; private:
&#160; &#160; double *x;
 
&#160;  public:
&#160;  vektor(int size);
 
&#160;  ~vektor();
&#160; };
vektor::vektor(int size)
&#160; {
&#160; &#160; x=new double[size];
&#160; &#160; printf("create vector \n");
&#160; }
 
vektor::~vektor()
&#160; {
&#160; &#160; delete x;
printf("destroyed vector \n");
&#160; }
 
 
class matrix
{
private:
&#160; &#160; int nmas,mmas;&#160;
public:
&#160; double **mas;
&#160; matrix(int n,int m);
&#160; zapol(int n,int m);
&#160; freemem(int n);
&#160; ~matrix();
};
 
matrix::matrix(int n,int m): nmas(n),mmas(m)
{
&#160; int i;
&#160; mas = new double* [nmas];
&#160; for (i=0;i<n;i++)
&#160; {
&#160; &#160; mas[i] = new double(mmas);
&#160; }
&#160; printf("create matrix \n");
 
}
 
matrix::zapol(int n,int m)
{
int i,j;
for (i=0; i<n; i++)
for (j=0; j<m; j++)
*(*(mas+i)+j)=i+j;
 
for (i=0; i<n; i++)
{
printf("\n");
for (j=0; j<m; j++)
printf("%.3f&#160; ",*(*(mas+i)+j));
}
 
}
 
matrix::freemem(int n)
{
&#160; int i;
&#160; for (i=0; i<n; i++)
&#160; {
&#160; &#160; delete mas[i];
&#160; }
&#160; delete []mas;
&#160; printf("\n free memory \n");
}
 
matrix::~matrix()
{
&#160; printf("destroyed matrix \n");
}
 
 main(int argc, char *argv[])
{
 int n,m;
&#160; &#160;  n=(int)atof(argv[1]);
m=(int)atof(argv[2]);
matrix a(n,m);
vektor x(n);
a.zapol(n,m);
a.freemem(n);
 
 
getch();
return 0;
}


Название: Re: Вопросы в С/С++
Отправлено: Alder от Март 11, 2008, 07:56:29
TARAKAN, дебаггер в руки. Ставь брейкпоинты и проверяй где именно вываливается, на  каком операторе.


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Март 11, 2008, 08:25:16
Alder
Буду искать ...


З.Ы. http://kita.org.ua/index.php/topic,4002.msg56885.html#new

(Отправлено в: 11 Марта 2008, 19:03:11)

Ошибка оказалась вот в этом цикле
Код: (cpp)
for (i=0; i<n; i++) 
{
delete mas[i];
}

Если его убрать все нормально, но тогда освобождение памяти неправильное ...
Но если оставить этот цикл, а убрать функцию заполнения/вывода на экран массива, все нормально (массив создается, выделяется память, освобождается память без ошибок и вылетов)

Не могу понять связь между меду заполнением и освобождение памяти ...


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Март 11, 2008, 09:32:13
TARAKAN, проверять, проверять и еще раз проверять. Удостоверься (сам, а не с помощью форумчан), что ты не удаляешь чего лишнего. Например, не освобждаешь память, которую не отводил. Или не освобождаешь память дважды.

Не могу понять связь между меду заполнением и освобождение памяти ...
А всё просто. Только для тебя - "Работа с динамической памятью за 5 минут". :D Итак, правила простые:
Отвёл - освободи.
Не отводил - не освобждай. :D
Освободил - не вздумай осовбождать еще раз.


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Март 11, 2008, 09:42:23
EvilMax
В функции, где я присваиваю значения, я не отвожу память ... поэтому и не пойму как она может влиять на освобождение памяти ...
Выделение и освобождение памяти в отдельных "частях" находятся ... специально, чтобы не запутаться  :)
Вот программа польностью
Код: (cpp)
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>

class vektor
  {
    private:
      double *x;
 
    public:
      vektor(int size);

     ~vektor();
  };
vektor::vektor(int size)
  {
    x=new double[size];
    printf("create vector \n");
  }
 
vektor::~vektor()
  {
    delete x;
printf("destroyed vector \n");
  }


class matrix
{
private:
    int nmas,mmas; 
public:
  double **mas;
  matrix(int n,int m);
  zapol(int n,int m);
  freemem(int n);
  ~matrix();
};
 
matrix::matrix(int n,int m): nmas(n),mmas(m)
{
  int i;
  mas = new double* [nmas];
  for (i=0;i<n;i++)
  {
    mas[i] = new double(mmas);
  }
  printf("create matrix \n");

}

matrix::zapol(int n,int m)
{
int i,j;
for (i=0; i<n; i++)
for (j=0; j<m; j++)
*(*(mas+i)+j)=123;

for (i=0; i<n; i++)
{
printf("\n");
for (j=0; j<m; j++)
printf("%.3f  ",*(*(mas+i)+j));
}

}

matrix::freemem(int n)
{
  int i;
  for (i=0; i<n; i++)
  {
    delete mas[i];
  }
  delete []mas;
  printf("\n free memory \n");
}

matrix::~matrix()
{
  printf("destroyed matrix \n");
}

 main(int argc, char *argv[])
{
 int n,m;
     n=(int)atof(argv[1]);
m=(int)atof(argv[2]);
matrix a(n,m);
vektor x(n);
a.zapol(n,m);

a.freemem(n);


getch();
return 0;
}


Название: Re: Вопросы в С/С++
Отправлено: LazarusLong от Март 11, 2008, 09:49:15

Отвёл - освободи.
Не отводил - не освобждай. :)
Освободил - не вздумай осовбождать еще раз.
Супер. Ни убавить, ни прибавить! +1.


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Март 11, 2008, 10:55:23
Вот программа польностью
1. Ты очень невнимательный. Проверь программу еще раз (я ошибку уже нашел).
2. Пока что много мешанины - используешь класс совершенно неправильно. Зачем передавать в методы данные, которые и так отражают состояние класса, т.е. хранятся в атрибутах? Это делает применение ООП в этой программе бессмысленным.
3. Будь внимательнее с объявлением методов. Есть отклонения от стандарта.
4. Напоминаю, здесь задаём вопросы по языку, а не "у меня не работает лаба, где ошибка?"

Ищите, исправляйте. Только так научитесь.

PS: назревает тема онлайн-консультаций? ;)


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Март 12, 2008, 12:59:22
Цитировать
Напоминаю, здесь задаём вопросы по языку
::) Тогда такой вопрос...
Код: (cpp)
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>

class vektor
  {
    private:
int sizex;
      double *x;
 
    public:
      vektor(int size);

     ~vektor();
  };
vektor::vektor(int size): sizex(size)
  {
    x=new double[sizex];
printf("create vector \n");
  }
 
vektor::~vektor()
  {
    delete x;
printf("destroyed vector \n");
  }


class matrix
{
private:
    int nmas,mmas; 
vektor **mas;
public:
  matrix(int n,int m);
  ~matrix();
  zapol();

};
 
matrix::matrix(int n,int m): nmas(n),mmas(m)
{
  int i;
  mas = new vektor* [nmas];
  for (i=0;i<nmas;i++)
  {
    *(mas+i) = new vektor(mmas);
  }
  printf("create matrix \n");

}

  matrix::zapol()
{
int i,j;
for (i=0; i<nmas; i++)
for (j=0; j<mmas; j++)
*(*(mas+i)+j)=123;

/* for (i=0; i<nmas; i++)
{
printf("\n");
for (j=0; j<mmas; j++)
printf("%.3f  ",*(*(mas+i)+j));
}
*/
printf("\n 123 \n");
}


 matrix::~matrix()
{
 int i;
  for (i=0; i<nmas; i++)
  {
    delete *(mas+i);
  }
  delete []mas;
  printf("\n free memory \n");
  printf("destroyed matrix \n");
}

 main()
{
 int n,m;
 printf("vvedite n\n");
   scanf("%d",&n);
 printf("vvedite m\n");
   scanf("%d",&m);
vektor x(n);
matrix a(n,m);
getch();
a.zapol();
getch();
return 0;
}

Если закомментировать всю функцию zapol все нормально получается вот такой результат
Цитировать
vvedite n
2
vvedite m
2
create vector
create vector
create vector
create matrix

 123
destroyed vector
destroyed vector

 free memory
destroyed matrix
destroyed vector
Press any key to continue

Но если убрать комментарий с заполнения, то получается вот такое
Цитировать
vvedite n
2
vvedite m
2
create vector
create vector
create vector
create matrix
create vector
destroyed vector
create vector
destroyed vector
create vector
destroyed vector
create vector
destroyed vector

 123
Дальше программа вылетает...

Вопрос такой. Почему заполнение массива
Код: (cpp)
  matrix::zapol()
{
int i,j;
for (i=0; i<nmas; i++)
for (j=0; j<mmas; j++)
*(*(mas+i)+j)=123;

 вызывает вот это
Цитировать
create vector
destroyed vector
create vector
destroyed vector
create vector
destroyed vector
create vector
destroyed vector
Т е вместо заполнения получается выделение памяти и ее освобождение сразу ...
Правильно ли Artem90 дал подсказку на счет указателей ? Или надо както подругому обращаться ?


Как я понял из-за этого в последствии и вылетает программа,  тк пытается освободить память, которую уже освободили ... другой "причины" найти не могу :(


Название: Re: Вопросы в С/С++
Отправлено: LazarusLong от Март 12, 2008, 01:17:03
Потому что *(*(mas+i)+j) - это вектор. А не его элемент.


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Март 12, 2008, 01:24:12
LazarusLong
А как обратиться к эл-ту ? Из-за этого двойного указателя не пойму ничего =\


Название: Re: Вопросы в С/С++
Отправлено: LazarusLong от Март 12, 2008, 01:38:17
Обрати внимание на то, что элементы массива внутри класса вектор у тебя хранятся в double *x. Ты же этот икс в обращении вообще не используешь. Ну и по структуре у меня есть замечания, но здесь - не лучшее место что бы их писать ))). Думайте, господа студенты ))))


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Март 12, 2008, 01:22:22
В общем то, что кидал перед этим, переделал вот так... хотя бы не вылетает и освобождает память ...  конечно много чего можно подругому сделать, сейчас хотя бы чтоб работало делаю  :D
Код: (cpp)
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>

class vektor
  {
    private:
int sizex;
      double *x;
 
    public:
      vektor(int size);
  void setelem(int j,double num) { *(x+j)=num; }
double getelem(int j) { return *(x+j); }
     ~vektor();
  };
vektor::vektor(int size): sizex(size)
  {
    x=new double[sizex];
printf("create vector \n");
  }
 
vektor::~vektor()
  {
    delete x;
printf("destroyed vector \n");
  }


class matrix
{
private:
    int nmas,mmas; 
vektor **mas;
public:
  matrix(int n,int m);
  ~matrix();
  zapol();


};
 
matrix::matrix(int n,int m): nmas(n),mmas(m)
{
  int i;
  mas = new vektor* [nmas];
  for (i=0;i<nmas;i++)
  {
    *(mas+i) = new vektor(mmas);
  }
  printf("create matrix \n");

}

  matrix::zapol()
{
int i,j;
for (i=0; i<nmas; i++)
for (j=0; j<mmas; j++)
(*(mas+i))->setelem(j,123.321);

for (i=0; i<nmas; i++)
{
printf("\n");
for (j=0; j<mmas; j++)
printf("%.3f  ",(*(mas+i))->getelem(j));
}

printf("\n 123 \n");
}


 matrix::~matrix()
{
 int i;
  for (i=0; i<nmas; i++)
  {
    delete *(mas+i);
  }
  delete []mas;
  printf("\n free memory \n");
  printf("destroyed matrix \n");
}

 main()
{
 int n,m;
 printf("vvedite n\n");
   scanf("%d",&n);
 printf("vvedite m\n");
   scanf("%d",&m);
vektor x(n);
matrix a(n,m);
getch();
a.zapol();
getch();
return 0;
}


vimmax
Цитировать
Если выделяешь память new[] то и удалять ты должен через delete[]
Ну, я освобождаю сначала то, что выделил последнее, т е delete *(mas+i);, а потом delete []mas; ... запустил раз 10 программу с параметрами 1000х1000 вроде все нормально ...

(Отправлено в: 12 Марта 2008, 12:00:06)

Спасибо, не заметил в vektor []x;


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Март 12, 2008, 07:04:54
vimmax, ну что ж, тема назрела - будем и онлайн-консультации устраивать ;) Надо только подумать, как разнести по темам вопрсы по языку и консультации по программам/лабам. Где там наш модератор раздела "Программирование"? ;)

Да, vimmax, еще вопрос: что происходит при удалении массива с помощью delete[] ? Проверял - память в кучу возвращается. Знаю, что delete[] гарантирует вызов деструктора для каждого элемента, а вот как быть с необъектным типом?

ЗЫ: думал, это допускает только старый Борланд, но вот что получил от профайлера KDevelop для такого кода:

Код: (cpp)
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream>
#include <cstdlib>

using namespace std;


main(int argc, char *argv[])
{
long *x;
for (int i=0; i<1000; i++)
{
x=new long[1000];
x[i]=11;
delete x;
}

cout << "Success" << endl;

return EXIT_SUCCESS;
}

Цитировать
All heap blocks were freed -- no leaks are possible.

gcc версия 4.2.2 20071128 (prerelease) (4.2.2-3.1mdv2008.0)

И еще, вопрос к читателям: у кого-нибудь есть откорректированный релиз 2003 года стандартов C/C++, и какие компиляторы их поддерживают? У меня они есть, но старенькие: 1998 года, без коррекций 2003-го.


Название: Re: Вопросы в С/С++
Отправлено: Sochin от Март 12, 2008, 11:32:32
EvilMax

Имеется черновик стандарта С++. Финальная версия документа платная.


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Март 12, 2008, 11:41:33
Off-Topic - помечено автором как "не соответствует обсуждаемой теме"
Имеется черновик стандарта С++. Финальная версия документа платная.
Ок, спасибо. Остальное - через личку.


Название: Re: Вопросы в С/С++
Отправлено: zer_owlet от Март 13, 2008, 01:42:34
Я пишу максимум на VB.NET, но может таки http://www.cplusplus.com/doc/tutorial/ вот это поможет?

Найдено в гугле по "C++ manual"... Если еще и вопрос подгадать, то вообще будет отлично...


Название: Re: Вопросы в С/С++
Отправлено: Артем от Март 13, 2008, 01:33:49
Здравствуйте, у меня компилятор Borland C++ 3.11, не подскажите есть ли какая-нибудь библиотечная ф-ия для создания каталога ???

(Отправлено в: 13 Марта 2008, 12:19:23)

Спасибо! Интересная информация о работе с файлами, но к сожалению о каталогох ни слова...


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Март 13, 2008, 01:34:50
artem90
гугль

Создание папки (http://www.google.com/search?hl=ru&client=opera&rls=ru&hs=Gkk&q=%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5+%D0%BF%D0%B0%D0%BF%D0%BA%D0%B8+%D0%B2+%D0%A1%2B%2B&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=)

(Отправлено в: 13 Марта 2008, 12:34:14)

Я перепутал немного ссылки ...

Помоему на такие вопросы быстрее найти ответ в поисковике можно, а не ждать ответа на форуме ...
З.Ы. кнопка дабл пост есть ;)


Название: Re: Вопросы в С/С++
Отправлено: Артем от Март 13, 2008, 03:06:54
Google руулит! Я наше создание каталога и работа сним. Может кому нибудь пригодиться: http://www.codenet.ru/progr/cpp/spr/296.php


Название: Re: Вопросы в С/С++
Отправлено: zer_owlet от Март 13, 2008, 11:52:17
Гугль -- это один из основных инструментов разработчика. Если после часа поиска вы так ничего и не нашли -- вот тогда кидайте сюда свой "очень сложные" вопросы... ИМХО, это и в правила раздела можно запихать....


Название: Re: Вопросы в С/С++
Отправлено: vimmax от Март 18, 2008, 12:07:06
Хочу тут один вариант выложить. Как при помощи шаблонов организовать многомерный массив чисел.
может студентам пригодится.

Код: (cpp)
template <class TempClass>
class vektor
 {

   private:
     int sizeX;
     TempClass *X;
 
   public:
    vektor(int size): sizeX(size)
{
   X=new TempClass[sizeX];
}

    vektor()
{
X=NULL;
sizeX=0;
};

void Init(int size)
{
sizeX = size;
if(X != NULL) delete[] X;
X=new TempClass[sizeX];
}

TempClass& operator[](int i)
{
return X[i];
}

    ~vektor()
{
if(X != NULL) delete[] X;
}

 };

int main(int argc, char* argv[])
{
vektor < vektor < int > > A; // создание объекта

A.Init(1); // инициализация строк
A[0].Init(3); // инициализация кол-ва элементов 1-ой строки

A[0][0] = 0; // обращение к элементам класса
A[0][1] = 1;
A[0][2] = 2;
return 0;
}


Название: Re: Вопросы в С/С++
Отправлено: naxellar от Март 18, 2008, 03:23:49
Дайте ссылки на информацию о создании форм и их использовании на Microsoft Visual Studio (если важно, то версия 2008) для языка C++


Название: Re: Вопросы в С/С++
Отправлено: zer_owlet от Март 18, 2008, 03:44:55
Дайте ссылки на информацию о создании форм и их использовании на Microsoft Visual Studio (если важно, то версия 2008) для языка C++

Просто ради интереса... а какие ты поисковые фразы юзал чтобы найти?

Вот тут (http://www.google.com/search?hl=en&q=winAPI+%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5+%D1%84%D0%BE%D1%80%D0%BC&btnG=Search) смотрел?

ЗЫ: ну хоть вводи что-то типа пароля для лентяев -- чтобы ответили на их вопрос, нужно предъявить поисковые фразы для гугля... мож тогда пропадут вопросы, которые в MSDN найти можно...

если инет хороший, попробуй тут порыться: http://www.knigka.info/category/win32. бывают хорошие штуки


Название: Re: Вопросы в С/С++
Отправлено: Романыч от Март 18, 2008, 04:28:42
Почистил от оффтопа
Обновлены правила раздела "Программирование" (http://kita.org.ua/index.php/topic,1753.msg21145.html#msg21145)
Романыч


2 naxellar
http://www.knigka.info/category/win32


Название: Re: Вопросы в С/С++
Отправлено: Sochin от Март 18, 2008, 04:36:53
naxellar

Microsoft Visual Studio 2008, а значит и .NET Framework, в плане UI это: Windows Forms (http://msdn2.microsoft.com/ru-ru/netframework/aa497379(en-us).aspx) или Windows Presentation Foundation (http://msdn2.microsoft.com/en-us/netframework/aa663326.aspx) на выбор. Создание и использование форм ничем не отличается от создания и использования объектов других классов.

Вызовы Win32 API хоть и поддерживаются, но смысла их использовать для создания форм не вижу никакого. Во-первых, .NET Framework уже содержит нативные средства для построения UI. А во-вторых, на целевой платформе никакого Win32 API может и не быть в принципе.


Название: Re: Вопросы в С/С++
Отправлено: vimmax от Март 18, 2008, 04:46:34
Sochin не совсем понял, что ты имеешь ввиду.
Цитировать
Вызовы Win32 API хоть и поддерживаются, но смысла их использовать для создания форм не вижу никакого
ведь Win32 API это сист. библиотеки Windows почему бы их не использовать ? или ты имеешь ввиду что MFC лучше ?

Цитировать
А во-вторых, на целевой платформе никакого Win32 API может и не быть в принципе.
но ведь .NET Framework не кроссплатформенная ?

можешь поподробнее ?


Название: Re: Вопросы в С/С++
Отправлено: Sochin от Март 18, 2008, 05:13:17
vimmax

Microsoft Visual Studio 2008 генерит байт-код, исполняемый виртуальной машиной. Это обеспечивает кроссплатформенность на уровне скомпилированного кода(!). Такое приложение может быть запущено на любой ОС, для которой есть реализация это виртуальной машины.
Хотя Микрософт для win-платформ предлагает .NET Framework, существуют и реализации под другие платформы, в том числе и в рамках open source-инициатив. К примеру, реализация .NET - Mono (http://www.mono-project.com/Main_Page) поддерживает(как обещается) Linux, FreeBSD, OpenBSD, NetBSD, Microsoft Windows, Solaris, OS X.





Название: Re: Вопросы в С/С++
Отправлено: Артем от Март 19, 2008, 08:16:19
Подскажите, пожалуйста. кто знает, что будет в такой ситуации:

Код: (cpp)
class A
  {
     int a;
  };

class B
  {
       int a;
   };

class AB: public A, public B { };

Получается множественное наследование класса AB от классов A и B. Но ведь A и B содержат один общий атрибут: int a. Какой из них будет унаследован ????


Название: Re: Вопросы в С/С++
Отправлено: zer_owlet от Март 19, 2008, 08:22:34
я, конечно, не знаток С++, но все же... я бы, перед тем как задавать такой вопрос, попробовал запустить этот код и посмотреть что же будет. задай атрибутам разные значения, а потом в классе АВ просто выведи AB::a на экран...

ЗЫ: поправте плиз, если я гоню...

ЗЗЫ: и вопрос автору вопроса -- расскажи плиз как ты сам пытался найти ответ на вопрос.


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Март 20, 2008, 07:15:48
Подскажите, пожалуйста. кто знает, что будет в такой ситуации:

Код: (cpp)
class A
  {
     int a;
  };

class B
  {
       int a;
   };

class AB: public A, public B { };

Получается множественное наследование класса AB от классов A и B. Но ведь A и B содержат один общий атрибут: int a. Какой из них будет унаследован ????
Оба. Только в твоём примере из наследника ты к ним не доберешься, ибо они private у родителей.


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Март 20, 2008, 08:14:51
Предупреждение с artem90 снято, тему подчистил.

Хочу предупредить всех: вы видели, что бывает за флуд и разборки в тематическом форуме. То что предупреждение было сразу снято, это исключение, которое в данной теме не повторится. Давайте заниматься здесь C/C++


Название: Re: Вопросы в С/С++
Отправлено: LazarusLong от Март 20, 2008, 10:44:46
При этом если модифицировать слегка код

Код: (cpp)
class A
{
public:
          int a;
};   

class B
{
public:
          int a;
};
     
class AB: public A, public B { };


И попробовать где-нибудь в программе обратиться к унаследованому свойству следующим образом:

Код: (cpp)
AB obj;
obj.a = 5;
Возникнет ошибка. Ввиду неоднозначности. Необходимо явно указывать к какому а (к унаследованному от какого класса) происходит обращение

Где то так:

Код: (cpp)
AB obj;
obj.A::a = 10;
obj.B::a = 15;


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Март 20, 2008, 11:58:18
Да, LazarusLong верно ответил. Аналогичный пример был в лекции, но только с методами (так как "светить" внутренним устройством класса не рекомендуется). Наследники содержат полные копии всех своих предков. Единственное - к чему-то нет доступа из-за ограничений области видимости. В данном примере показано, что унаследованы оба атрибута, но из-за неоднозначности с именем необходимо явно указывать тип базового класса при обращении.


Название: Re: Вопросы в С/С++
Отправлено: Артем от Март 23, 2008, 01:04:57
Товарищи, кто-то может мне подсказать, в C++ выделение памяти в куче происходит оператором new, его аналог в С - malloc() или calloc(). А вот перераспределить память чем можно? В С, например, я юзал realloc(), а в C++ что-то подобное есть?


Название: Re: Вопросы в С/С++
Отправлено: naxellar от Март 23, 2008, 03:17:32
artem90
Цитировать
Функция calloc() принимает два параметра: число ячеек массива, под которые надо выделить память, и размер этой ячейки в байтах; делает эта функция следующее: выделяет нужное количество памяти (непрерывный кусок) и обнуляет все значения в нём.
Си++ - Викиучебник (http://ru.wikibooks.org/wiki/%D0%A1%D0%B8%2B%2B)
malloc() просто выделяет память, но не очищает значения в участке памяти.
Цитировать
Важное отличие оператора new от функции malloc() заключается в том, что он возвращает значение типа "указатель-на-объект" (то есть MyClass *), в то время как функция malloc() - "указатель-на-что-угодно" (void *).


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Март 24, 2008, 08:42:57
Код: (cpp)
class asd
{
private:
    int flag;
public:
   qwe(int flag1);
};

asd::qwe(int flag1): flag(flag1)
{
//...
}
В qwe передается просто число т е qwe(1);
Выдает Error C2550
http://msdn2.microsoft.com/en-us/library/e1d7ee6d(VS.71).aspx
А если вот так
Код: (cpp)
asd::qwe(int flag1)
{
flag=flag1;
}
то все нормально... в MSDN понимаю ошибку, но не вижу такую же у себя ???

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


Название: Re: Вопросы в С/С++
Отправлено: vimmax от Март 24, 2008, 08:50:42
TARAKAN а в чем проблема?
MSDN сказано: "'identifier' : constructor initializer lists are only allowed on constructor definitions" = листы инициализации разрешены только в конструкторах. Метод qwe конструктором не является, поэтому первый пример неправильный.


Название: Re: Вопросы в С/С++
Отправлено: Сис_Одмин от Март 30, 2008, 09:22:22
переопределение и перегрузка оператора это одно и тоже?


Название: Re: Вопросы в С/С++
Отправлено: LazarusLong от Март 30, 2008, 09:59:15
Сис_Одмин, да.


Название: Re: Вопросы в С/С++
Отправлено: Артем от Март 31, 2008, 09:28:27
Кто знает, объясните пожалуйста, в чем проблема. У меня компилятор Borland C++ 3.11.
Я решил поэкспериментировать с типами данных с плавающей точкой, набрал простейший код:

Код: (cpp)
#include <iostream.h>

void main()
  {
    float a;
    a=50*1000;
    cout<<a;
  }

Результат: -15536

Я вообще-то ожидал увидеть 50000. В чем причина, ведь для типа float диапазон экспонент ограничен в пределах от -37 до +37. Число 50000 уж точно лежит в этом диапазоне. К тому же тип float гарантиркет 6 значащих цифр, а в числе 50000 только 1 цифра явл. значащей. Так что вроде бы все должно быть ок.

Подскажите, пожалуйста в чем проблема, в компиляторе или я напорол чего нить :)

(Отправлено в: 31 Марта 2008, 20:35:09)

Ошибку нашел, не хватало явного приведения целочисленных констант к вещественному типу:

Код: (cpp)
a=50*1000.;

или так:
Код: (cpp)
a=(float)50*1000;

Но все таки старенький Борланд 3.11 сыграл злую шутку, ведь на Борланде 6 все работало изначально хорошо. Ведь явное привеление к вещественному типу используеться при ДЕЛЕНИИ целочисленных констант, а при умножении я думал, что все сделает компилятор, поэтому и протупил.


Название: Re: Вопросы в С/С++
Отправлено: Артем от Апрель 18, 2008, 07:43:00
Известно, что при описании ф-ии компилятор не учитывает имена параметров и возвращаемое значение. Но при перегрузке ф-ий, обязательным условием для всех перегружаемых ф-ий явл. одинаковое имя и ОДИНАКОВЫЙ ТИП ВОЗВРАЩАЕМОГО ЗНАЧЕНИЯ. А почему же, если возвращаемое значение не входит в сигнатуру ф-ии, оно играет при перегрузке такую важную роль?


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Апрель 18, 2008, 10:11:30
Известно, что при описании ф-ии компилятор не учитывает имена параметров и возвращаемое значение. Но при перегрузке ф-ий, обязательным условием для всех перегружаемых ф-ий явл. одинаковое имя и ОДИНАКОВЫЙ ТИП ВОЗВРАЩАЕМОГО ЗНАЧЕНИЯ. А почему же, если возвращаемое значение не входит в сигнатуру ф-ии, оно играет при перегрузке такую важную роль?

Тип возвращаемого значения при перегрузке функций и методов не учитывается.
Код: (cpp)
#include "stdafx.h"

int a() {
return 1;
}

float a() {
return 1.5;
}

int _tmain(int argc, _TCHAR* argv[])
{
float x = a();
}
Компиляция данного примера сгенерировала ошибку:
Цитировать
Error   1   error C2556: 'float a(void)' : overloaded function differs only by return type from 'int a(void)'   c:\users\max\documents\visual studio 2008\projects\testex\testex\testex.cpp   10   TestEx


Название: Re: Вопросы в С/С++
Отправлено: naxellar от Апрель 22, 2008, 09:56:22
Функция WinMain() в MSDN:
Код: (cpp)
int WINAPI WinMain(      
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
)
Однако в примере (firststeps.ru) увидел ее как
Код: (cpp)
int APIENTRY WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
)
Нашел
Код: (cpp)
#define APIENTRY    WINAPI
#define WINAPI      __stdcall
Вопрос: Почему вместо APIENTRY нельзя сразу использовать сразу __stdcall или на крайний случай WINAPI, как в MSDN?


Название: Re: Вопросы в С/С++
Отправлено: LazarusLong от Апрель 22, 2008, 10:31:57
naxellar, код во всех случаях идентичный. Видимо можно писать по любому, хотя лично я не приветствую использование макроопределений в принципе, но если мелкософт предлагает такие макроопределения - видимо у них таки какие-то резоны были.


Название: Re: Вопросы в С/С++
Отправлено: [Йожжж] от Апрель 30, 2008, 06:39:40
Несколько вопросов по переопределению операций.
1) Почему при переопределении ~ компилятор говорит, что это следует делать без передачи параметров? У нас же есть 2 матрицы, между которыми что-то поиходит (по условию задания) ... По идее хотя бы ссылку на 1 из них надо передать. Возможно я неправ.
2) При переопределении какой-то операции я передаю одну из них параметром, а вторая переходит с указателем this. При переопределении мне надо создать новую матрицу и ее заполнить по условию задания. Я ее создаю, и выходит, что указатель на самую первую матрицу затирается и на его место появляется указатель на новую только что созданную матрицу? (вряд ли это так, но лучше спросить у более опытных людей).
А можно ли обойтись без создания новой матрицы и просто заменить элементы одной из данныйх нам матриц по правилу?
Заранее спасибо всем, кто чем-либо поможет.
З.Ы. Матрица - считай что объект =)


Название: Re: Вопросы в С/С++
Отправлено: LazarusLong от Апрель 30, 2008, 07:23:14

компилятор говорит, что это следует делать без передачи параметров
Это потому, что нельзя менять количество параметров у операторов, имеющих встроенные прототипы. Грубо говоря ты не сможешь перегрузить оператор = как унарный, а оператор ~ (который изначально унарный) как бинарный.


Название: Re: Вопросы в С/С++
Отправлено: Артем от Апрель 30, 2008, 08:13:55
При переопределении какой-то операции я передаю одну из них параметром, а вторая переходит с указателем this. При переопределении мне надо создать новую матрицу и ее заполнить по условию задания. Я ее создаю, и выходит, что указатель на самую первую матрицу затирается и на его место появляется указатель на новую только что созданную матрицу?
[Йожжж], указатель this - это неявный указатель на тот объект, метод которого вызывается, и затереться он не может. Если ты в этом методе создаешь еще одну матрицу (т.е. ЛОКАЛЬНЫЙ объект этого же класса), то к ней ты обращаешься по имени объекта, а указатель this по прежнему указывает на первоначальный объект, с методом которого ты работаешь, а обратиться к самому объекту ты можешь с пмощью разименованного указателя - *this.

А можно ли обойтись без создания новой матрицы и просто заменить элементы одной из данныйх нам матриц по правилу?
Напиши конкретную операцию, которую собираешься переопределять, потому что в общем все операции под одну гребенку брать нельзя.


Название: Re: Вопросы в С/С++
Отправлено: [Йожжж] от Апрель 30, 2008, 09:33:48
Здесь писать, так здесь :)

Код: (cpp)
class matrix
{
/*......*/
           public:
                       matrix operator >> (const matrix&);
                       matrix operator < (const matrix&);
};
matrix matrix :: operator >> (const matrix &mat)
{
float sum;
int k, newM;
if (this->GetM() <= mat.GetM())
newM = this->GetM();
else
newM = mat.GetM();
matrix V2(newM, 1);
for (int i = 0; i<mat.GetM(); i++)
{
sum = 0;
for (int j = 0; j<newM; j++)
{
sum += this->GetElement(i, j);
k++;
}
V2.SetElement(i, 0, mat.GetElement(i, 0) + sum/this->GetN());
}
return V2;
}

Вопщем вначале мы урезаем и находим минимальную длину для вектора из размеров 2-х исходных рбъектов: матрицы и вектора. При чем матрица находится под указателем this, а вектор: &mat. В данном примере каждый элемень вектора V2 - это элемент вектора V(он же mat), увеличенный на среднее арифметическое соответсвующей строки матрицы М(this). Тут проблема одна: среднее арифметическое он находит, а вот элементы вектора V(mat) тут даже не учитываются ??? Т.е. в итоге я получаю вектор V2, каждый элемент которого - ср. арифмет. строк матрицы М.

Код: (cpp)
matrix matrix :: operator < (const matrix &mat)
{
float newM, newN;
if(this->GetM() <= mat.GetM())
newM = this->GetM();
else
newM = mat.GetM();
if(this->GetN() <= mat.GetN())
newN = this->GetN();
else
newN = mat.GetN();
matrix M3(newM, newN);
for (int i = 0; i<M3.GetM(); i++)
for (int j = 0; j<M3.GetN(); j++)
{
if (this->GetElement(i, j) < mat.GetElement(i, j))
M3.SetElement(i, j, this->GetElement(i, j));
else
if (this->GetElement(i, j) > mat.GetElement(i, j))
M3.SetElement(i, j, this->GetElement(i, j) - mat.GetElement(i, j));
else
M3.SetElement(i, j, pow(this->GetElement(i, j), 2));
}
return M3;
}

В этом случае я, сравнивая элементы матриц М1 и М2 (this и mat), заполняю новую матрицу М3. Проблема: все элементы матрицы М3 - элементы матрицы М2.


Название: Re: Вопросы в С/С++
Отправлено: TARAKAN от Май 02, 2008, 03:32:03
Код: (cpp)
class figyra
  {
    protected:
     int x11,y11,rad;
    public:
//..
     virtual void setpar1(int,int,int)=0;
//..
  };

  class kryg: public figyra
  {
    public:
     kryg(): figyra() { cout<<"create kryg"; };
     ~kryg() { cout<<"destroyed kryg"; };
    void setpar1(int,int,int);
//..
  };
   void kryg::setpar1(int x11,int y11,int rad);
  {
    this->x11=x11;
    this->y11=y11;
    this->rad=rad;
  }
Ошибка
Цитировать
Class member 'kryg::setpar1(int,int,int);' declared outside its class

http://unix.org.ua/bcpp/r74_6_2.htm
Цитировать
Class member элемент declared outside its class
Сообщение об ошибке этапа компиляции (элемент класса объявлен вне своего класса)

Функции-элементы класса С++ могут описываться только внутри объявления класса. В отличие от функций, не являющихся элементами класса, они не могут иметь несколько объявлений или описываться в других местах.

В наследовании до сих пор толком не разбираюсь ... сначала подумал, что ругается на имена переменных в setpar1(int x11,int y11,int rad);, т к эти имена используются в классе figyra, но заменив их на любые другие результат такой же ...

Как решить такую проблему ?

(Отправлено в: 02 Мая 2008, 14:57:13)

Частично проблема решена там ";" ненужные были вот тут
void kryg::setpar1(int x11,int y11,int rad);  ::)


Название: Re: Вопросы в С/С++
Отправлено: [Йожжж] от Май 03, 2008, 11:17:04
Вопрос непосредственно к EvilMax. У меня в выче №3 есь переопределение операции "~", но это унарная операция. По условию задания с помощью нее у меня из столбцов двух матриц выбираются минимальные элементы, и они становятся элементами нового вектора. Можно ли изменить сам значок операции? Например, вместо "~" использовать "-", " * " и др?

Этот вопрос нужно задавать в учебном отделе. Пользуйтесь ЛС!
Романыч


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Май 03, 2008, 06:24:22
Можно ли изменить сам значок операции?
Нет. Так как это будет уже другая операция ))) Если нужны два операнда, обратитесь к составителю задания и попросите заменить операцию на другую в своём варианте.

Знак операции, число операндов, приоритет изменить нельзя. Ассоциативность тоже (хотя накосячить при реализации можно).


Название: Re: Вопросы в С/С++
Отправлено: Артем от Май 06, 2008, 06:36:07
Объясните пожалуйста такую вещь:

Есть текстовый файл, состоящий из двух строк (рисунок прилагается). Я считываю символы начиная с самого начала и до символа перехода на новую строку '\n'. Кол-во считанных символов подсчитываю счетчиком length. После выхода из цикла я с помощью метода tellg() возвращаю кол-во бит от начала файла. Вывожу length и tellg() на экран, и рез-тат меня неприятно удивляет :( Я ожидал, что length будет равно 9, так как в строке у меня 9 символов + '\n', и думал что tellg()  тоже должен вернуть 9, т.к нумерация битов с 0, то это был бы 10-ый символ, то есть '\n'. Но tellg() почему-то вернул 11, а это значит что файловый указатель указывает на 12-ый символ, а этот символ - пробел !!! Почему файловый укзатель перепрыгнул на 2 символа ?

Код: (cpp)
#include <iostream.h>
#include <fstream.h>
#include <iomanip.h>
#include <conio.h>

void main()
  {
    int length=0;
    ifstream fin("C:/1.txt");

    clrscr();

    while(fin.good() && fin.get()!='\n')
      {
        length++;
      }
    cout<<"length = "<<setw(2)<<length;
    cout<<"  byte = "<<setw(2)<<fin.tellg();
   
    getch();
  }

Рез-тат:
Код: (cpp)
length =  9  byte = 11


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Май 06, 2008, 07:22:49
Потому что символ \n в Dos/Windows представляет собой пару символов CR+LF (т.е. фактически \r\n). А так как он всё-таки считан, то файловый указатель показывает на позицию сразу за ним, т.е. на символ '6', который имеет смещение в файле как раз 11 байт.

Наглядно содержимое файла можно увидеть в прикреплении. Последовательность 0D 0A - это как раз коды CR (\r) и LF(\n). Они  результат нажатия клавиши Enter при наборе файла или при выводе в текстовом режиме символа \n при условии ОС Windows или DOS


Название: Re: Вопросы в С/С++
Отправлено: Артем от Май 06, 2008, 08:38:10
EvilMax, спс ! Теперь все стало понятно и вполне логично :)


Название: Re: Вопросы в С/С++
Отправлено: zer_owlet от Май 08, 2008, 12:20:16
да, старые грабли в винде с этим \r\n... я у себя тоже долго искал баг с разбивкой файла на строки... пока не подсмотрел в hex-редакторе что у файла текстового (набирался в винде) назделитель \r\n


Название: Re: Вопросы в С/С++
Отправлено: Der_Forscher от Май 08, 2008, 06:11:20
Код: (c)
#include <iostream.h>
#include <alloc.h>

int main()
  {
    void far *buf;

    buf = farmalloc(25);
    if(buf == NULL) {
cout<<"Error"<<endl;
return 1;
    }

    farfree(buf);

    return 0;
  }

Можете подсказать почему у меня farmallock() память не выделяет???

ЗЫ: компилятор BC++ v3.1


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Май 09, 2008, 01:33:01
А в опциях компилятора модель памяти large? Потому что в случае tiny все данные находятся в одном сегменте 64К и farmalloc по-идее не имеет смысла.


Название: Re: Вопросы в С/С++
Отправлено: Der_Forscher от Май 09, 2008, 08:37:06
EvilMax спасибо, как-то сразу не додумался )))


Название: Re: Вопросы в С/С++
Отправлено: Артем от Сентябрь 14, 2008, 02:37:23
Доброй ночи ! :)

В процессе экспериментирования с ф-ями getimage() и putimage() оказалось, что они отказываются работать, если размер сохраняемой экранной области >= 65535 байт. Использую дальние указатели, модель памяти Huge.
Цитировать
long size = imagesize(x1, y1, x2, y2);
void far* buf = farmalloc(size);
getimage(x1, y1, x2, y2, buf);
//...
farfree(buf);
При чем, в режиме SVGA 256 1024*768, максимальное разрешение картинки, которая корректно сохраняется - 250*250 пикселей, и imagesize возвращает 250*250 = 62500 байт. При попытке сохранить картинку с разрешением 255*255, Борланд зависает, а выведенный на экран imagesize показывает 65535.

В режиме VGAHI 16 640*480 корректно сохраняются картинки с разрешением <= 350 пикселей, 350*350 / 2 = 61250 байт. Не знаю, нужно ли здесь делить на 2. Я сделал это только чтобы получить число приближенное к 65535 )

Вопрос: возможно ли вообще увеличить эту область памяти, чтобы можно было сохранять картинки более выского разрешения ?

ЗЫ: Облазил кучу настроек самой среды, и все значения связанные с объемом памяти поставил на максимум, но это не помогло :( В хелпе написано, что ф-ия imagesize() возвращает (-1), если размер экранной области >= 64K-1, но это звучит как-то абсурдно, неужели можно сохранять только такие маленькие области экрана  ???  В инете нашел обсуждение подобной проблемы, но внятного ответа так никто и не дал.

Заранее спасибо, за любую полезную информацию.


Название: Re: Вопросы в С/С++
Отправлено: Alder от Сентябрь 14, 2008, 11:07:18
Если мне не изменяет память, то это связано с тем, что компилятор 16-битный. Решения вроде бы должны быть. Надо поискать.


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Сентябрь 14, 2008, 11:22:15
Доброй ночи ! :)

В процессе экспериментирования с ф-ями getimage() и putimage() оказалось, что они отказываются работать, если размер сохраняемой экранной области >= 65535 байт. Использую дальние указатели, модель памяти Huge.
Цитировать
long size = imagesize(x1, y1, x2, y2);
void far* buf = farmalloc(size);
getimage(x1, y1, x2, y2, buf);
//...
farfree(buf);
При чем, в режиме SVGA 256 1024*768, максимальное разрешение картинки, которая корректно сохраняется - 250*250 пикселей, и imagesize возвращает 250*250 = 62500 байт. При попытке сохранить картинку с разрешением 255*255, Борланд зависает, а выведенный на экран imagesize показывает 65535.

В режиме VGAHI 16 640*480 корректно сохраняются картинки с разрешением <= 350 пикселей, 350*350 / 2 = 61250 байт. Не знаю, нужно ли здесь делить на 2. Я сделал это только чтобы получить число приближенное к 65535 )

Вопрос: возможно ли вообще увеличить эту область памяти, чтобы можно было сохранять картинки более выского разрешения ?

ЗЫ: Облазил кучу настроек самой среды, и все значения связанные с объемом памяти поставил на максимум, но это не помогло :( В хелпе написано, что ф-ия imagesize() возвращает (-1), если размер экранной области >= 64K-1, но это звучит как-то абсурдно, неужели можно сохранять только такие маленькие области экрана  ???  В инете нашел обсуждение подобной проблемы, но внятного ответа так никто и не дал.

Заранее спасибо, за любую полезную информацию.
1. В Borland/Turbo C++ из-за 16-битной платформы нельзя работать с блоками памяти более 64К. Если вспомнишь лекции, то осознаешь весь трагизм ситуации :D Ни malloc, ни calloc, ни операция new не сможет отвести блок более 64К. То же касается и функций, которые работают с памятью.
2. Деление на 2 "чтобы получить приближенное к 64К число" - это весело :) Хотя, как ни странно, делить правильно. Ибо видеорежим VGAHI поддерживает 16 отображаемых цветов палитры. Следовательно, глубина цвета 4 бита на пиксель, т.е. 0.5 байта.
3. твет на твой вопрос таков. Если хочешь делать это 1й операцией - пиши свой менеджер памяти и свои варианты getimage/putimage. Основная идея - отводить память за несколько операций, храня каждый блок как вектор указателей на отведенные блоки. Ну и работа с кусками изображения - аналогично. Выкусывать и писать в память кусочками. Ну или как предлагает Alder, работать напрямую со страницами видеопамяти. Но, боюсь, так просто, нахрапом, такая задача тебе не отдастся. ;)


Название: Re: Вопросы в С/С++
Отправлено: Артем от Сентябрь 14, 2008, 11:34:14
Alder, EvilMax, спасибо, что отозвались. Чувствую, что и скроллбар, и перетаскивание окна мышью стали под большим вопросом :(


Название: Re: Вопросы в С/С++
Отправлено: Alder от Сентябрь 14, 2008, 11:49:14
artem90, вообщем есть такое счастье как Allegro (http://www.talula.demon.co.uk/allegro/). Полноценная игровая библиотека. DOS поддерживается. Одна незадача - вроде как только с bcc32 компилером, а это уже минимум Borland C++ 5.1 или Borland C++Builder. Но изучить основы реализации никто не запрещает. В частности тебе прийдется сделать замены getimage и putimage, которые режут картинку на кусочки, сохраняют и также потом восстанавливают. Беглый просмотр исходников Allegro показал, что там подобное реализовано. Так что будет полезно поизучать. Если заставить библиотеку собраться под 16-битным компилером, то я думаю, что можно будет поговорить с Максимом Владимировичем о разрешении на использование ее функций в курсовой. При условии, что вы сделали это самостоятельно :)


Название: Re: Вопросы в С/С++
Отправлено: Артем от Сентябрь 14, 2008, 11:58:12
Alder, спс :) Щас буду разбираться. Сейчас еще просмотрю 2-ой том Аммерала. Он посвящен машинной графике, и большинство ф-ий реализованы на нижнем уровне.


Название: Re: Вопросы в С/С++
Отправлено: Alder от Сентябрь 14, 2008, 12:02:08
Небольшая поправка на ветер - Allegro под DOS собирается двумя компиляторами DJGPP (http://www.delorie.com/djgpp/) и Watcom (http://www.openwatcom.org/index.php/)(который теперь OpenWatcom)


Название: Re: Вопросы в С/С++
Отправлено: Anna от Октябрь 05, 2008, 12:55:20
Я в отчаянии. Объясните мне, пожалуйста, что не так с приведением типов:

Код:
#include<iostream.h>

void main(){
  long double  c=500166.0;
  int ce = (int)c;

      cout<<"c="<<c<<endl<<"ce="<<ce;
      cin.ignore();
}

Результат:
c=500166
ce=-24122


Название: Re: Вопросы в С/С++
Отправлено: Olorin от Октябрь 05, 2008, 02:52:08
Если сделать так:
Код:
#include<iostream.h>

void main(){
  long double  c=500166.0;
  long ce = (long)c;

      cout<<"c="<<c<<endl<<"ce="<<ce;
      cin.ignore();
}

то всё работает))


Название: Re: Вопросы в С/С++
Отправлено: Anna от Октябрь 05, 2008, 02:57:39
Ну, как всегда, все было совсем не так! На самом деле нужно было привести  дабл к лонг инт... И так все сразу бы заработало! Сколько времени уходит на невнимательность :(
Спасибо тебе,  добрый Олорин :)


Название: Re: Вопросы в С/С++
Отправлено: likedrug от Октябрь 06, 2008, 11:54:08
диапазон значений типа int  -32767..32767, т.е. 500166 > допустимого.
Можешь юзать long int, а можешь unsigned int т.е. беззнаковый и соответственно в 2 раза больше целочисленных значений (диапазон от 0 до 65535).


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Октябрь 07, 2008, 06:16:31
Не-не-не. 500 тыс. в unsigned не влезет. Так что на 16-битной платформе только long.


Название: Re: Вопросы в С/С++
Отправлено: likedrug от Октябрь 08, 2008, 05:35:09
:-D во я тип, чото подсознательно посчитал 50000 )))))))

Вот только флудить не нужно. artem90


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Октябрь 14, 2008, 06:20:11
А у меня вот такой вопрос, господа. Делаю я лабораторную работу по дискретной математике и пытаюсь реализовать операции над множествами. В своей программе я написал эдакий класс и перегружаю для него операции и вот у маленькая проблемка. По моему заданию мое единичное универсальное множество - это число 0..255. Допустим у меня есть Множества A = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } И мне нужнно получить множество НЕ А, т.е. дополнение до единичного множества. Если учесть, что мое единичное множество это числа от 0 до 255, множество НЕ А это числа в данном диапазоне не включая цифры 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 .
Так вот я перегружаю оператор ~ и пишу для него тело.

Код:
class Union
{
private : unsigned int * data;
unsigned int size;

public  :
Union();
Union(Union &obj);
Union(unsigned int NewSize,unsigned int *NewData);
       ~Union();

void SetSize(unsigned int NewSize) { size = NewSize; }
void SetElement(unsigned int el,unsigned int index)
{
data[index] = el;
}
unsigned int GetSize() { return size; }
unsigned int GetElement(unsigned int index)
{
return data[index];
}
       unsigned int* GetData() { return data; }

       unsigned int& operator[](unsigned int index);
       friend ostream& operator<<(ostream&,Union& obj);

       Union  operator*(Union &A);   // crossing
       Union  operator+(Union &A);   // combaine
       Union  operator/(Union &A);   // minus
       Union  operator%(Union &A);   // simmitrical minus
       Union  operator~();        // not
       Union& operator=(const Union &obj);
};

Union Union::operator~()
{
unsigned int  i,j,k,flag;
unsigned int  NewSize = 256 - this->GetSize();
unsigned int* vector  = new unsigned int[NewSize];



for(j=0;j<=255;j++)
{

flag = 0;

for(i=0;i<this->GetSize();i++)
{
if (j==(*this)[i]) { flag = 1; }
else { continue; }
}
  if (flag==0)
  {
     vector[j] = j;
             cout<<vector[j]<<" "; // сейчас печатаетя правильный вектор
  }
}


cout<<endl<<endl;

for(i=0;i<246;i++)
{
cout<<vector[i]<<" "; // а сейчас нет, хотя массив не менялся
}

delete[] vector;
return (*this);
};

Union& Union::operator=(const Union &obj)
{
this->size = obj.size;
this->data = new unsigned int[this->size];
memcpy(this->data,obj.data,this->size*sizeof(unsigned int));
return *this;
};

unsigned int& Union::operator[](unsigned int index)
{
return data[index];
};

Union::Union()
{
data = NULL;
        size = 0;
};

Union::Union(unsigned int NewSize,unsigned int *NewData)
{
size = NewSize;
data = new unsigned int[size];
memcpy(data,NewData,size*sizeof(unsigned int));
};

Union::Union(Union &obj)
{
this->size = obj.size;
this->data = new unsigned int[this->size];
        memcpy(this->data,obj.data,size);
};

Union::~Union()
{
        delete[] data;
size = 0;

}

ostream& operator<<(ostream &s,Union& obj)
{
         int i;
         for(i=0;i<obj.size;i++)
         {
s<<obj.data[i]<<" ";
         }
                return s;
};
Я пытался отследить ошибку и стал печатать свой вектор в теле (временно конечно), но вот беда алгоритм, вроде, правильный. Первый раз я получаю корректную запись вектора, а в следующем блоке НЕТ.
Возникает вопрос почему?  ???


Название: Re: Вопросы в С/С++
Отправлено: LazarusLong от Октябрь 14, 2008, 07:20:56
Вкратце... во втором случае у тебя выводится как раз содержимое твоего массива. Ты, дело в том, что формируешь разреженный массив. Если такого элемента нет в исходном множестве, ты его вносишь в новый вектор (причем под номером соответствующим его значению, а если нет - то просто пропускаешь и оставляешь его значение не проинициализированным

В итоге: у тебя после выделения памяти массив vector указывает, к примеру на всякую билеберду

787984 46463 354534 32132 5646 ....

Так вот - так как 0, 1, 2, 3 и т.п. являются членами твоего исходного множества то элементы с этими номерами твоим преобразованием затронуты НЕ БУДУТ. И там останется вся та же билебирда.

Преобразованный код будет выглядеть так

Код:
Union Union::operator~()
{
unsigned int  i,j,k,flag;
unsigned int  NewSize = 256 - this->GetSize();
unsigned int* vector  = new unsigned int[NewSize];

        int t = 0;

  for(j=0;j<=255;j++)
{

flag = 0;

for(i = 0; i < this->GetSize(); i++)
{
if (j == (*this)[i])
                                flag = 1;
else
                                continue;
}
  if (flag==0)
  {
     vector[t] = j;
             cout<<vector[t]<<" ";
             t++;
  }
}


cout<<endl<<endl;

for(i=0;i<246;i++)
{
cout<<vector[i]<<" ";
}

delete[] vector;
return (*this);
};



Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Октябрь 14, 2008, 07:37:18
LazarusLong, огромное спасибо ))))))))))  :)


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Октябрь 18, 2008, 05:03:18
Здравствуйте, уважаемые господа. Хочу услышать от вас совет. Я пишу некий шаблонный класс вектор, который может хранить любые типы данных. В нем я переопределяю опрации ввода\вывода на экран и в файл. Но вот в чем беда: когда я создаю объекты моего класса, инстанцированные типом char* все работает вроде корректно, но если инстанцирую типо int вот, что выдает:

Error ..\..\COURSE~1\TEMPLATE.CPP 73: Ambiguity between 'operator <<(fstream &,_TVector<int> &)' and 'ostream::operator <<(char)'
Error ..\..\COURSE~1\TEMPLATE.CPP 62: Ambiguity between 'operator >>(fstream &,_TVector<int> &)' and 'istream::operator >>unsigned char &)'

Вопрос почему ?
Код:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<iostream.h>
#include<stdlib.h>
#include<fstream.h>
#include<string.h>

template<class T>
class _TVector
{


      private :
            T* data;
            unsigned int size;
      public :
         
            _TVector(void);

            _TVector(const _TVector<T> &v);

            _TVector(unsigned int new_size);

            ~_TVector(void);

void operator=(_TVector<T> &vec);

unsigned int GetSize() const { return size; }

void SetSizet(unsigned int new_size) { size = new_size; };

T& _TVector<T> :: operator[] (unsigned int index);

friend ostream& operator<<(ostream& buffer, _TVector<T>& d);

friend fstream& operator<<(fstream& buffer, _TVector<T>& d);

friend void operator>>(fstream& buffer, _TVector<T>& d);


};


template<class T>
void _TVector<class T>::operator=(_TVector<T> &vec)
{
   this->size = vec.size;
   memcpy(this->data,vec.data,this->size*sizeof(T));
};

template<class T>
_TVector<T> :: _TVector(void) { data = NULL; size = 0; };


template<class T>
void operator>>(fstream& buffer, _TVector<T>& d)
{
   int i;
   for(i=0;i<d.size;i++)
   {
    buffer>>d;
   }

};

template<class T>
fstream& operator<<(fstream& buffer, _TVector<T>& d)
{
   int i;
   for(i=0;i<d.size;i++)
   {
    buffer<<d<<" ";
   }
   return buffer;
};


template<class T>
ostream& operator<<(ostream& buffer,_TVector<T>& obj)
{
   int i;
   for(i=0;i<obj.size;i++)
   { buffer<<obj.data<<" "; }
   return buffer;
};

template<class T>
_TVector<T>::_TVector(const _TVector<T> &vec)
{
   this->size  = vec.size;
   this->data  = new T[size];
   memcpy(this->data,vec.data,vec.size*sizeof(T));
};

template<class T>
_TVector<T>::_TVector(unsigned int new_size)
{
   this->size = new_size;
   this->data = new T[size];
};

template<class T>
_TVector<T>::~_TVector() { delete [] data;};

template<class T>
T& _TVector<T>::operator[] (unsigned int index)
{
    return data[index];
};


int main()
{
clrscr();
_TVector<int> vec(4);
int i;
for(i=0;i<4;i++)
{
 vec = i;
 cout<<vec<<endl;
}

fstream vector("C:\\vector.txt",ios::in | ios::out);
fstream file("C:\\vector.txt",ios::in | ios::out);
vector<<vec;

file>>vec;

cout<<vec;

cin.ignore();
return 0;
}
 


Название: Re: Вопросы в С/С++
Отправлено: LazarusLong от Октябрь 18, 2008, 05:18:51
А что за компилятор?
(Отправлено в: 2008-10-18, 17:14:41)
 Мне не совсем понятно как этот код вообще работает. Вот ты пишешь:
Цитировать
vec = i;
А я что-то не вижу перегруженного оператора присваивания для целых чисел.


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Октябрь 18, 2008, 05:27:24
Ой ошибочка вышла  :(

Компилятор Borland C++ 3.1

вот так надо:

Код:
int main()
{
clrscr();
_TVector<int> vec(4);
int i;
for(i=0;i<4;i++)
{
 vec[i] = i;
 cout<<vec[i]<<endl;
}

fstream vector("C:\\vector.txt",ios::in | ios::out);
fstream file("C:\\vector.txt",ios::in | ios::out);
vector<<vec;

file>>vec;

cout<<vec;

cin.ignore();
return 0;
}


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Октябрь 18, 2008, 07:01:01
Странно. У меня собралась программа нормально. Borland C++ 3.1


Название: Re: Вопросы в С/С++
Отправлено: LazarusLong от Октябрь 18, 2008, 07:29:29
Странно. У меня собралась программа нормально. Borland C++ 3.1
А у меня в Билдере вообще не собралась ???.


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Октябрь 18, 2008, 07:54:34
Так, после исправления в студии других ошибок в коде (посмотри на объявление операции индексирования, на реализацию присваивания, на то, как ты работаешь с данными внутри переопределённых операций) проблема стала ясной.
Ты не указал, что дружественные переопределённые операции являются шаблонными. Надо перед friend дописать template <class U> (кстати, как я показывал на лекции). Но вот незадача, 3-й борланд у меня не дружит с дружественными шаблонными функциями. :( Поэтому вывод векторов в файл и на экран придётся тебе делать без друзей.
Ещё один баг борланда. Он не захотел че-то у меня перегружать операцию вывода на экран, пока я ему не указал вместо ostream&  в явном виде ostream_withassign&


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Октябрь 18, 2008, 10:37:13
хм все это очень странно.

у меня почему-то операция вывода на экран перегружалась корректно. Ладно сделаю эти операции без друзей. НО вот другой вопроси: а что нетак с объявлением операции индексирования и присваивания? По-моему все нормально? Если это не так, то укажите, пожалуйста, на ошибки или некорректности, в я вном виде  :)


Название: Re: Вопросы в С/С++
Отправлено: Артем от Октябрь 18, 2008, 11:30:55
а что нетак с объявлением операции индексирования и присваивания?

В присваивании память под data не выделена, добавь строчку data = new T[size];

Цитировать
template<class T>
void _TVector<class T>::operator=(_TVector<T> &vec)
{
   this->size = vec.size;
   data = new T[size];
   memcpy(this->data,vec.data,this->size*sizeof(T));
};



Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Октябрь 18, 2008, 11:54:51
Упс  ??? Это за ошибку не считается - это ачепятка  :D


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Октябрь 19, 2008, 10:09:36
1) T& _TVector<T> :: operator[] (unsigned int index); - объявлена внутри класса, писать _TVector<T> :: не нужно

2) Вместо template<class T> void _TVector<class T>::operator
лучше template<class T>void _TVector<T>::operator

3) Внутри перегруженных операций вектор вводился/выводился не поэлементно. А целиком. Этакая рекурсия с перегрузкой.



Название: Re: Вопросы в С/С++
Отправлено: Olorin от Ноябрь 13, 2008, 12:56:44
Случай значит такой:

Код:
void far *img;
unsigned size=imagesize(left,top,left+width,top+height);
img=farmalloc(size);
if (img == 0)
{
   closegraph();
   printf("Error: not enough heap space in save_screen().\n");
   getch();
   exit(1);
}
getimage(left,top,left+width,top+height,img);

Никак не хочет выделять память, чтоб впихнуть туда картинку. Что я делаю не так?


Название: Re: Вопросы в С/С++
Отправлено: Alder от Ноябрь 13, 2008, 01:24:31
Olorin, размер картинки какой?


Название: Re: Вопросы в С/С++
Отправлено: Olorin от Ноябрь 13, 2008, 08:57:02
Olorin, размер картинки какой?
imagesize(left,top,left+width,top+height);
где
width=320;
height=240;
top==getmaxy()/2-height/2;
left=getmaxx()/2-width/2;


Название: Re: Вопросы в С/С++
Отправлено: Артем от Ноябрь 13, 2008, 10:10:45
Olorin, а модель памяти Huge ? Option -> Compiler -> Code generation -> Model


Название: Re: Вопросы в С/С++
Отправлено: Olorin от Ноябрь 13, 2008, 10:45:02
Olorin, а модель памяти Huge ? Option -> Compiler -> Code generation -> Model
Small. А кая должна быть?

ЗЫ Кстати спасибо, помогло. Выставил на Huge.


Название: Re: Вопросы в С/С++
Отправлено: tos от Ноябрь 13, 2008, 11:09:04
о господи!
а компилятор какой??


Название: Re: Вопросы в С/С++
Отправлено: Olorin от Ноябрь 13, 2008, 11:14:15
Использую Турбо Си. Версию не знаю.


Название: Re: Вопросы в С/С++
Отправлено: tos от Ноябрь 14, 2008, 12:08:21
как сказал один мудрец, "Вот только флудить не нужно. artem90"
а мой ответ таков - юзайте нормальные компилеры, которые не так часто отшивают с выделением памяти.
сам писал работу с картинками на 2 курсе вроде.
ну так вот борлондоСИ частеько мне отказывал в выделении памяти, причём рандомно.
мы не настолько богаты временем, чтобы искать решения пустяковых проблем.
мой вердикт - потратьте час на установку MSVS нормальной версии.
или Qt там например


Название: Re: Вопросы в С/С++
Отправлено: Артем от Ноябрь 14, 2008, 12:37:46
tos, если человек юзает старенький Турбо Си, то значит на это есть весомые причины. Тем более если это студент, который для выполнения учебной задачи ограничен в выборе компилятора. От тебя уже неоднократно были подобные посты, в которых ты советовал сменить компилятор на более современный, и это уже порядком надоело. В дальнейшем все подобные сообщения будут расцениваться как флуд и незамедлительно удаляться.


Название: Re: Вопросы в С/С++
Отправлено: Kenny от Ноябрь 14, 2008, 02:42:31
Односвязный список, ввод, вывод.
Код:
#include <iostream>
using namespace std;
#include <string.h>
#include <conio.h>
struct List
{
char* name;
int count;
List *next;
List(const char *);
~List();

void print();
};
List::List(const char *name)
{
this->name = new char[ strlen(name)+1 ];
strcpy(this->name, name);
}
List::~List()
{
if(name!=NULL) delete name;
next = NULL;
}
void List::print(){
cout<<"#"<<count<<"      "<<name<<endl;
}
class Abzzz
{
public:
void Add(List *element);
Abzzz();
~Abzzz();
void print();
private:
int count;
List *Head,*Tail;
};
void Abzzz::Add(List *element){
if(count)
{
Tail->next = element;
element->count=count;
element->next = NULL;
Tail = element;
}
else
{
Head=element;
element->count=count;
Tail = element;
}
count++;
}
Abzzz::Abzzz()
{
count=0;
}

Abzzz::~Abzzz()
{

for(int i=0; i<count; i++)
{
Head=Head->next;
Head->next=Tail;
delete Tail->next;
Tail->next=Head;
}
}

void Abzzz::print()
{
List *curr = Head;
while(curr)
{
curr->print();
curr = curr->next;
}

}
int main()
{
Abzzz A;
char S[256];

cout<<"Name :"<<endl;
cin>>S;
A.Add(new List(S) );
A.print();
getche();
return 0;
}
Работает, но после(во время) ввода получаем : Unhandled exception at 0x00a3169e in Lab_3.exe: 0xC0000005: Access violation reading location 0xcdcdcdcd.
PS VS2008.


Название: Re: Вопросы в С/С++
Отправлено: Артем от Ноябрь 14, 2008, 07:05:32
В методе Add, по else добавь строчку element->next = NULL;  Вот рабочий код:
Код:
#include <iostream.h>
using namespace std;
#include <string.h>
#include <conio.h>
struct List
{
char* name;
int count;
List *next;
List(const char *);
~List();

void print();
};
List::List(const char *name)
{
this->name = new char[ strlen(name)+1 ];
strcpy(this->name, name);
}
List::~List()
{
if(name!=NULL) delete name;
next = NULL;
}
void List::print(){
cout<<"#"<<count<<"      "<<name<<endl;
}
class Abzzz
{
public:
void Add(List *element);
Abzzz();
~Abzzz();
void print();
private:
int count;
List *Head,*Tail;
};
void Abzzz::Add(List *element){
if(count)
{
Tail->next = element;
element->count=count;
element->next = NULL;
Tail = element;
}
else
{
Head=element;
element->count=count;
Tail = element;
                       element->next = NULL;
}
count++;
}
Abzzz::Abzzz()
{
count=0;
}

Abzzz::~Abzzz()
{

for(int i=0; i<count; i++)
{
Head=Head->next;
Head->next=Tail;
delete Tail->next;
Tail->next=Head;
}
}

void Abzzz::print()
{
List *curr = Head;
while(curr)
{
curr->print();
curr = curr->next;
}

}
int main()
{
Abzzz A;
char S[256];

cout<<"Name :"<<endl;
cin>>S;
A.Add(new List(S) );
A.print();
getche();
return 0;
}

Ошибка возникала в методе вывода спсика print(), из-за недоработок в методе Add. Условием выхода было while(curr != NULL), но это условие всегда было истинно, потому что в методе добавления 1-ого элемента в спсиок, указателю на следующий элемент спсика НЕ присваивался NULL, и прога зависала в вечном цикле, при этом еще пытаясь вызвать метод print() у объекта "Мусор" )))


Название: Re: Вопросы в С/С++
Отправлено: Kenny от Ноябрь 14, 2008, 04:33:32
Да, спасибо, проблема решилась чуть раньше чем прочитал.


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Ноябрь 23, 2008, 12:00:49
Тут такая ситуация в BC 3.1 сделал небольшую менюшку и все пункты и кнопки подписаны естественно на английском и вот вопрос: как бы мне засунуть туда русские буквы так, чтобы не было проблем с кодировкой? Есть вариант открыть исходник в текстовом редактрое, вписать туда нужные название и сохранить в ДОС кодировке, но как эт сделать? какой редактор выбрать? В общем кто, что посоветует ?  ???


Название: Re: Вопросы в С/С++
Отправлено: Alder от Ноябрь 23, 2008, 12:25:39
Магнетон Бора, смотри в сторону keyrus.com (http://ru.wikipedia.org/wiki/KeyRus) - руссификатора для DOS. Его необходимо запускать перед запуском bc, а потом в редакторе появится возможность вводить русские буквы (переключение раскладки по умолчанию - правый Ctrl) Самом собой, что keyrus необходимо будет запускать и потом - перед запуском программы отдельно, а не из IDE. Для удобства напиши подобный bat-файл:
Код:
@echo Start keyrus
keyrus.com
@echo Start programm
progname.exe


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Ноябрь 23, 2008, 12:31:20
Спасибо, Alder! Сейчас попробую )))))


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Ноябрь 23, 2008, 01:27:05
хм.... а вот можно про последнее (про bat файл)  немного подробнее, я имею в виду как его создать и отладить, я пробывал его создать в IDE Builder 6, но что-то у меня никак не выходит, раньше с этим не сталкивался


Название: Re: Вопросы в С/С++
Отправлено: tos от Ноябрь 23, 2008, 01:42:36
берёшь создаёшь текстовый документ в блокноте, пишешь там всё, а потом меняешь расширение на .bat


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Ноябрь 23, 2008, 02:36:57
Все равно никак не получается (
Делаю вот, что:
Включил руссификатор, в среде напечатал нужные пункты меню, как надо оно не печатается почему-то.
Потом создал bat-файл с кодом который посоветавал Alder:

Код:
@echo Start keyrus
keyrus.com
@echo Start GIFS
GIFS.exe
GIFS - моя программа, после запуска там все равно высвечиваются непонятные символы, вместо нужных пунктов меню (


Название: Re: Вопросы в С/С++
Отправлено: vimmax от Ноябрь 24, 2008, 10:22:25
а в полноэкранный режим переходил ? по алт+ентер


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Ноябрь 24, 2008, 02:39:27
вобще-то я меню делал в графическом режиме и естественно переходил в полноэкранный режим, дело в том, что оно уже в среде программирования не выводит русские символы, а должно выводить (((



Название: Re: Вопросы в С/С++
Отправлено: Alder от Ноябрь 24, 2008, 03:04:33
Магнетон Бора, что ж ты сразу не сказал, что меню в графике. Само собой там кейрус не работает. Ищи руссифицированные bgi-шрифты. Такие были.


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Ноябрь 24, 2008, 03:25:43
Alder, спасибо за совет ))))) ТОлько всё-равно не могу понять почему в среде программирования при написании программы кейрус не работает ?


Название: Re: Вопросы в С/С++
Отправлено: tos от Ноябрь 24, 2008, 03:27:31
при написании?
наверно ж надо перед запуском BC запускать keyrus?


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Ноябрь 24, 2008, 03:31:59
Tos, я уж догадался его запустить перед этим, вот только тут такая вещь в BC 3.1 есть пункт repaint desktop, при первом запуске все печатаеться нормально, но если нажать на этот пункт и сделать перерисовку, то выводится ерундень (


Название: Re: Вопросы в С/С++
Отправлено: Alder от Ноябрь 24, 2008, 03:33:15
Магнетон Бора, а он русским не печатает или закорючки печатает?


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Ноябрь 24, 2008, 03:48:41
Ну если я программирую не в полноэкранном режиме, то печатается все хорошо (русские буквы) и без активации кейрус, но стоит перейти в полный экран там вылезают закарючки, я у же пробывал установить в каталог bgi другие шрифты, которые в сети нарыл, но все равно не помогает (


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Ноябрь 24, 2008, 03:58:32
Может кто-нибудь подскажет где скачать нормальные руссифицированные bgi-шрифты ?


Название: Re: Вопросы в С/С++
Отправлено: Alder от Ноябрь 24, 2008, 04:34:31
Для непонимающих и непомнящих - читаем (http://kita.org.ua/index.php/topic,2978.msg823539.html#msg823539)!


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Ноябрь 24, 2008, 04:39:03
А если теперь по теме, может, Alder, подскажешь где взять хорошие руссифицированные bgi-шрифты ? ))))


Название: Re: Вопросы в С/С++
Отправлено: tos от Ноябрь 24, 2008, 05:02:14
гуглил?
обычно 90 вопросов решаются гуглом.
вбил я  "bgi шрифты".
первая же ссылка
http://www.turbo-pascal.ru/fonts.php (http://www.turbo-pascal.ru/fonts.php)


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Ноябрь 24, 2008, 05:10:13
вау, чувак, я там уже был, установил те шрифты, но безполезно (


Название: Re: Вопросы в С/С++
Отправлено: Артем от Ноябрь 24, 2008, 05:38:30
Магнетон Бора, а ты для установки дополнительных шрифтов юзал ф-ию installuserfont (http://www.codenet.ru/progr/cpp/spr/243.php) или просто копирнул в папку с bgi ?


Название: Re: Вопросы в С/С++
Отправлено: tos от Ноябрь 24, 2008, 05:39:48
а ну блин это ж шрифты для графики а не для ИДЕ.
"Неплохая коллекция bgi шрифтов для работы в графическом режиме"


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Ноябрь 24, 2008, 06:02:38
всем спасибо за моральную поддержку, но я уже разобрался... не без помощи нашего tosa  я скачал шрифты отсюда http://www.turbo-pascal.ru/fonts.php. Потом скопировал их в папку bgi, но при разработке программ нужно изменить тип шрифта на любой другой, кроме DEFAULT_FONT и все будет круто ))))))))


Название: Re: Вопросы в С/С++
Отправлено: Dieselboy от Ноябрь 26, 2008, 11:52:31
Здравствуйте, я к вам с нубским вопросом)
Есть проблема в сдаче одной из самых первых работ. Условие вроде не трудное: вычислить и вывести на экран значения функции на интервале от х1 до х2 с шагом dx, выполнить проверку на корректность ввода данных (...) дальнейшее условие значения не имеет. Вот что у меня вышло:
Цитировать
#include <stdio.h>
#include <math.h>

main (){
float a,b,c,x1,x2,dx,F,x;
int A,B,C,i=0;
printf ("a=");
scanf ("%f", &a);
printf ("b=");
scanf ("%f", &b);
printf ("c=");
scanf ("%f", &c);
do {
   printf ("x1=");
   scanf ("%f", &x1);
   printf ("x2=");
   scanf ("%f", &x2);
   printf ("dx=");
   scanf ("%f", &dx);
   }
while ((x1>x2 && dx>0) || (x1<x2 && dx<0) || (dx==0));
A=(int)a;
B=(int)b;
C=(int)c;
x=x1;
do{
if (x<10 && b!=0) F=a*x+b;
else {
   if (x>10 && b==0) F=1+c/x;
   else {
   if (c==0) {
         printf ("x=%f Net resheniya\n");
         goto M;
         }
   else F=(-pow(x,2))/c;
   }
}
if (F>0) i=i++;
if ((A|B)&(B&C)!=0) printf ("x=%f F=%f\n", x,F);
else {
   F=(int)F;
   printf ("x=%f F=%d\n", x,F);
   }
M:
x=x+dx;
}
while (x<=x2);
printf ("Kolichestvo polojitel'nih F=%d", i);
return 0;
}
Преподавателю чем-то не понравилось выделенное жирным в коде, только вот чем - никак не могу понять. Возможно, кто-то подскажет. Заранее спасибо)


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Ноябрь 27, 2008, 12:34:40
Спросил бы, чем не понравилось. Или, что лучше, объяснил, зачем это написал, а потом спросил, почему это плохо по мнению того, кому сдавал.


Название: Re: Вопросы в С/С++
Отправлено: Dieselboy от Ноябрь 27, 2008, 01:07:50
Ну вобщем-то спрашивал) Ответ был - подумай и допиши "штота там нужное" :)


Название: Re: Вопросы в С/С++
Отправлено: broken-wings от Ноябрь 27, 2008, 01:22:55
я не бэст-советчик, но не о замене переменных ли,случайно, идет речь?


Название: Re: Вопросы в С/С++
Отправлено: Артем от Ноябрь 27, 2008, 06:41:48
Dieselboy, вот это условие: while ((x1>x2 && dx>0) || (x1<x2 && dx<0) || (dx==0))

можно записать короче: while(x1>=x2 || dx<=0)



Название: Re: Вопросы в С/С++
Отправлено: tos от Ноябрь 27, 2008, 07:21:01
это не одно и то же.


Название: Re: Вопросы в С/С++
Отправлено: Артем от Ноябрь 27, 2008, 07:37:12
tos, а я не сказал что это одно и то же. Но для проверки корректности ввода диапазона и шага этого будет достаточно.


Название: Re: Вопросы в С/С++
Отправлено: broken-wings от Ноябрь 27, 2008, 08:25:27
я не скажу с 100 % уверенностью, но вроде там можно вводить уменьшающуюся последовательность. когда X1>x2 , dx<0 ... у нас в группе большинство делало в таком случае замену


Название: Re: Вопросы в С/С++
Отправлено: tos от Ноябрь 27, 2008, 08:45:17
а может обмен значениями??


Название: Re: Вопросы в С/С++
Отправлено: broken-wings от Ноябрь 27, 2008, 08:47:08
tos, ну да, неправильно выразил мысль.


Название: Re: Вопросы в С/С++
Отправлено: Kenny от Ноябрь 29, 2008, 02:04:43
Код:
Abrakadabra Abrakadabra::operator +(Abrakadabra tmp){
Abrakadabra temp;
int i;
temp.N=N+tmp.N;
string temp.*Stroka=new string[temp.N];<------- как правильно записать выделение в определенном объекте.
for(i=0;i<N;i++){
    temp.Stroka=Stroka;
}
for(i=N+1;i<temp.N;i++){
    temp.Stroka=tmp.Stroka;
}
return temp;
}
error C2143: syntax error : missing ';' before '.'
error C2371: 'temp' : redefinition; different basic type
(Отправлено в: Ноябрь 29, 2008, 01:02:14 )
 понятно, что в этой строке переопределение, но а как иначе?


Название: Re: Вопросы в С/С++
Отправлено: Артем от Ноябрь 29, 2008, 08:54:52
string temp.*Stroka=new string[temp.N];<------- как правильно записать выделение в определенном объекте.
temp.Stroka = new string[temp.N];


Название: Re: Вопросы в С/С++
Отправлено: Kenny от Ноябрь 29, 2008, 12:05:35
string temp.*Stroka=new string[temp.N];<------- как правильно записать выделение в определенном объекте.
temp.Stroka = new string[temp.N];

спасибо.


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Ноябрь 30, 2008, 10:29:04
Народ, а тут такой вопрос:

Допустим мы работаем в графическом режиме и нам нужно вернуться в текстовый режим и далее работать в нём. Я пробывал это делать по-разному: просто закрывать графическую библиотеку ( функция closegraph() ), пробывал использовать функцию restoctrmode(); но везде одна и таже проблема - после возврата в текстовый режим из графического шрифт, которым выводятся данные изменился и стал немного больше и как его изменить на страый ума не приложу ( старый это тот который был до того как был активирован графический режи, там символы были помельче ). Тут вот есть код, который иллюстрирует эту проблему:

Код:
#include<graphics.h>
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<iostream.h>

int main(void)
{
   int gdriver = DETECT, gmode, errorcode;
   int x, y;

   cout<<"We're in text mode\n";
   getch();
   initgraph(&gdriver, &gmode, "C:\\BORLANDC\\BGI");

   errorcode = graphresult();
   if (errorcode != grOk)  /* an error occurred */
   {
      printf("Graphics error: %s\n", grapherrormsg(errorcode));
      printf("Press any key to halt:");
      getch();
      exit(1);
   }

   x = getmaxx() / 2;
   y = getmaxy() / 2;

   settextjustify(CENTER_TEXT, CENTER_TEXT);
   outtextxy(x, y, "Press any key to exit graphics:");
   getch();

   /* "Пытаемся восстановить старый графический режим" */
   restorecrtmode();
   printf("We're now in text mode.\n");
   printf("Press any key to return to graphics mode:");
   getch();

   setgraphmode(getgraphmode());

   settextjustify(CENTER_TEXT, CENTER_TEXT);
   outtextxy(x, y, "We're back in graphics mode.");
   outtextxy(x, y+textheight("W"), "Press any key to halt:");

   getch();
   closegraph();
   return 0;
}

Кто-нибудь знает как сдлеать шрифт нормальным ?  :)

ЗЫ. Компилятор BC 3.1


Название: Re: Вопросы в С/С++
Отправлено: Артем от Ноябрь 30, 2008, 11:11:13
Скорее всего текстовый режим 80*50 строк, после перехода в граф режим и возврата в текстовый, меняется на 80*25. Попробуй использовать ф-ию textmode(C4350) чтобы вернуться в режим 80*50.


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Ноябрь 30, 2008, 11:17:42
спасибо, artem90; получилось )))))))


Название: Re: Вопросы в С/С++
Отправлено: Alder от Ноябрь 30, 2008, 12:40:13
Я бы предложил способ лучше - сохранять настройки текстового режима перед входом в графический режим и восстанавливать их на выходе. На BP это выглядело так:
Код:
uses Crt;
var OriginalMode: integer;
begin
    OriginalModer:=LastMode;
    ....
    ....
    TextMode (OriginalMode);
end.


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Ноябрь 30, 2008, 01:12:57
Цитировать
Я бы предложил способ лучше - сохранять настройки текстового режима перед входом в графический режим и восстанавливать их на выходе. На BP это выглядело так:

Я уже в принципе так и сделал, но спасибо за совет, Alder  :)


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Декабрь 13, 2008, 10:36:06
Уважаемы коллеги, возникла следующая трудность: при завершении работы написанной программы выскакиват ошибка Null pointer assignment, должен сказать моя любимая. В принципе я понимаю, что идет запись или удаление чего-то из нулевой области, как эффективно отследить эту ошибку, на одном форуме один чел делал троссировка и в watch добавил (char*)4, но почему именно эту область? В общем посоветуйте что-нибудь как избавиться от этой ошибки. Заранее благодарен.


Название: Re: Вопросы в С/С++
Отправлено: ZaQ от Декабрь 13, 2008, 02:31:39
дя начала платформа какая?
во вторых, конкретно кусок кода, куда ассерт ссылается, в третьих вопрос почетче опиши, гадать на кофейной гуще не охота.


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Декабрь 13, 2008, 02:52:53
Платформа BC 3.1, вопрос такой как отследить ошибку Null pointer assignment, кусок кода кинуть не могу могу только весь код, в этом-то и беда


Название: Re: Вопросы в С/С++
Отправлено: ZaQ от Декабрь 13, 2008, 05:42:43
вообщем гляди как используешь указатели, где зануленые можешь использовать, где используешь неинициализированные. вообще в ВС тяжело чет намудрить :)


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Декабрь 13, 2008, 06:26:48
вообщем гляди как используешь указатели, где зануленые можешь использовать, где используешь неинициализированные. вообще в ВС тяжело чет намудрить :)

Я уже разобрался.
В том то и дело, что я спрашивал какой-нибудь эффективный способ нахождения утечки памяти или просто некоректного обращения с последний, обычный способ просмотра при 1200 строчках кода затруднительный как минимум.
И должен сказать, что опыт показывает как раз в ВС 3.1 можно намудрить и очень, очень сильно у меня 10-ки примеров и не только со своего опыта...


Название: Re: Вопросы в С/С++
Отправлено: Артем от Январь 13, 2009, 12:27:21
Тема разделена, вопросы по алгоритмам теперь задаем тут (http://kita.org.ua/index.php/topic,7779.0.html)  


Название: Re: Вопросы в С/С++
Отправлено: SPL от Февраль 09, 2009, 09:27:54
Здравствуйте)
Писал тут программку, заметил некоторую странность. Кусок моего кода:
Код:
#include <stdio.h>
#include <stdlib.h>

void CreateArray(int *a, int m, int n)
{
int i,j;
randomize();
for (i=0;i<m;i++)
for (j=0;j<n;j++)
*(a+i*n+j)=random(30);
}

void PrintArray (int *a, int m, int n)
{
int i,j;
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
printf ("%7.1d", *(a+i*n+j));
printf ("\n");
}
}



main()
{
int m,n, array[20][20],i,j;
printf ("Enter size of matrix (max 20x20):\n");
 do
 {
 scanf ("%d", &m);
 scanf ("%d", &n);
 }
 while (m!=n || m<=0 || m>20);
CreateArray(array[0], m, n);
PrintArray (array[0], m, n);
printf("\n\n");
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
printf ("%7.1d", array[i][j]);
printf ("\n");
}
return 0;
}

Результат выходит такой:
(http://s49.radikal.ru/i126/0902/9b/8996991028e2.jpg)

Почему выходит так, что матрица распечатанная в функции PrintArray отличается от распечатанной в main?  :(


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Февраль 09, 2009, 09:35:25
Здравствуйте)
Писал тут программку, заметил некоторую странность. Кусок моего кода:

Почему выходит так, что матрица распечатанная в функции PrintArray отличается от распечатанной в main?  :(
Потому что некоторые штатские не слушают на лекции :P И не знают, что матрица хранится по строкам в памяти, и размер строки определяется объявлением.  Так как ты её объявил как матрицу 20х20, то размер одной строки равен 20 элементам, а не введенному пользователем n. Таким образом правильная адресация элементов *(a +i*20 + j). Ну и 20 можно сделать константой с помощью #define COLS 20 или передать еще один параметр в функцию, который отражает общее число столбцов (помимо параметра, отражающего, сколько из них хочет использовать программист).


Название: Re: Вопросы в С/С++
Отправлено: Storm от Февраль 09, 2009, 09:42:15
В программе все правильно.
Массив какого размера выделил? 20 на 20
вот при вычислении array[j] == (a+i*20+j) этот размер и принимается, а при вычислении (a+i*n+j) берется тобою заданное n.
здесь лучше динамически память с помощью malloc выделять под массив, сколько надо столько и выделяешь.


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Февраль 09, 2009, 09:44:12
В программе все правильно.
Где ж всё правильно, если вот это:

(a+i*n+j)
)))

Впрочем, мы оба ответили на вопрос ))


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Февраль 09, 2009, 09:45:46
здесь лучше динамически память с помощью malloc выделять под массив, сколько надо столько и выделяешь.
Требование в работе как раз объявить в main (если я не ошибаюсь, и это, действительно, 4-я лаба), чтобы народ прочувствовал тонкости адресации элементов. Думаю, вопрошающий как раз прочувствовал, и мы его обучили, что не может не радовать )))


Название: Re: Вопросы в С/С++
Отправлено: Storm от Февраль 09, 2009, 09:49:20
Программа работает правильно, ошибка в алгоритме.


Название: Re: Вопросы в С/С++
Отправлено: SPL от Февраль 09, 2009, 09:50:30
Спасибо, не подумал :)
Цитировать
здесь лучше динамически память с помощью malloc выделять под массив, сколько надо столько и выделяешь.

Ну это понятно, просто по условию необходимо без динамической памяти реализовать :)


Название: Re: Вопросы в С/С++
Отправлено: Артем от Февраль 24, 2009, 01:09:11
Вопрос по компиляции проекта в VC++ 2008 переехал в тему Компиляторы С/С++ (http://kita.org.ua/index.php/topic,5382.msg840359.html#msg840359)


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Март 03, 2009, 11:56:42

Всем доброй ночи, помогите решить такую проблему. У меня есть файлик вот такого содержания:

Код:
0000
0001
0010
0011

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

Вот код:
Код:
typedef union bit UBIT;

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

char path[] = "D:\\File.txt";
char *b;

b = new char[4];

UBIT s;
fstream InputFile("D:\\File.txt",ios::in|ios::out);

int i,j;

unsigned int buf;

buf = 0;

for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{

cout<<(char)InputFile.get();
}

cout<<endl;
InputFile.putback((char)InputFile.get());
}


InputFile.close();
cout<<"press ENTER"<<endl;
delete[] b;
cin.ignore();
return 0;

}

Как бы мне установить правильно позиционирование и считать строки файла?
Заранее благодарен  :)


Название: Re: Вопросы в С/С++
Отправлено: Артем от Март 04, 2009, 01:18:07
Я хочу каждую строчку считать отдельно
Магнетон Бора, для этого существует метод getline()
Код:
char str[5];
while(fin.good())
{
   fin.getline(str, 5);
   cout<<str<<endl;
}
fin.close();

Кстати, в приведенном тобой выше коде, ты выделяешь память под 4 символа в строке b, при этом забыв "забронировать" место для '\0'. Да и вообще, честно говоря, код странный, ведь строка b у тебя даже нигде не используется.


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Март 04, 2009, 10:11:01
Кстати, в приведенном тобой выше коде, ты выделяешь память под 4 символа в строке b, при этом забыв "забронировать" место для '\0'. Да и вообще, честно говоря, код странный, ведь строка b у тебя даже нигде не используется.
У него не строки, а массивы char, и читает он данные посимвольно. Так что в плане '\0' ошибки тут как раз нет. Главное потом не использовать переменную b как строку, а работать с ней только как с массивом. Но этого мы пока не увидели ))


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Март 05, 2009, 07:46:39
ммммм спасибо за помощь ))))))))))


Название: Re: Вопросы в С/С++
Отправлено: Alex08 от Март 08, 2009, 11:27:41
Здраствуйте...
Возникли проблемы при написании программы(((
Задача. найти количество предлогов в тексте по ООП.
вот до чего дошел, но оно не считает. предлоги((...помогите пжлста.



Название: Re: Вопросы в С/С++
Отправлено: Артем от Март 09, 2009, 01:40:17
Alex08, ф-ия strcmp используется для сравнения 2-ух строк, поэтому для поиска предлогов в строке она не подходит.  Можно использовать ф-ию для поиска подстроки в строке - strstr (http://www.codenet.ru/progr/cpp/sprd/strstr.php). Для этого в коде нужно будет сделать небольшие изменения.
Код:
char *p;
// ...
p = strstr(c, a[j]);
       if(p != NULL) k++;
Но тут есть один важный нюанс, ф-ия strstr возвращает указатель только на ПЕРВОЕ вхождение подстроки в строку. Поэтому, если в тексте будут повторяющиеся предлоги, то эта ф-ия уже не подойдет. В этом случае придется писать собственную ф-ию, которая будет посимвольно перебирать текст в строке, и подсчитывать кол-во предлогов.

Кстати, обрати внимание на то, что по заданию нужно работать с ТЕКСТОМ, а не с одной строкой. Поэтому потребуется создать массив строк и доработать лабу. Удачи !


Название: Re: Вопросы в С/С++
Отправлено: ZaQ от Март 09, 2009, 05:07:09
а stl юзать нельзя?
Кстати под дос можно OpenWatcom юзать. там и стл и еще куща всяких плюшек.


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Март 09, 2009, 05:09:51
Думаю, это 6-я лаба по по алгоритмизации (дисциплина "Основы программирования...", языка plain C). Вряд ли это по ООП - там классами и не пахнет. А в лабах по plain C используем как раз только этот самый plain C, никаких сторонних библиотек, и уж тем более, нельзя STL.

ZaQ, а оболочка (IDE) там какая-то удобоваримая есть?


Название: Re: Вопросы в С/С++
Отправлено: ZaQ от Март 09, 2009, 05:12:07
есть, и хелп есть. Скрины можно у них на сайте поглядеть.
кстати кросс-платформенная штука.


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Март 19, 2009, 11:12:06
Коллеги, помогите разобраться у меня есть бинарный файл в которомм зашифровано слово TRUE. Я его читаю, но в конце добавляется какой-то бред не могу понять почему...

Код:
#include "stdafx.h"

#include "fstream.h"
#include "conio.h"
#include "stdio.h"
#include <iostream>
#include <vector>
#include "math.h"

int main(int argc, char* argv[])
{
char path[] = "D:\\File_In";
char *b;
unsigned int zero, one;

fstream InputFile("D:\\File_In",ios::in|ios::binary|ios::out);

if (!InputFile)
{
cerr<<"Îøèáêà îòêðûòèÿ ôàéëà..."<<endl;
};

int i;

unsigned int buf;

b = new char[4];


InputFile.read(b,4);
cout<<b<<endl;

InputFile.close();
cout<<"press ENTER"<<endl;
delete[] b;
cin.ignore();
return 0;
}

Результат:
Код:
TRUE¤¤¤¤1
press ENTER

Откуда взялись остальные символы?  ???


Название: Re: Вопросы в С/С++
Отправлено: Alexandr от Март 19, 2009, 11:14:25
если я не все забыл, то это признак конца файла


Название: Re: Вопросы в С/С++
Отправлено: Магнетон Бора от Март 19, 2009, 11:18:20
А можно от них как-то при выводе избавиться, не прибегая к работе со строками?


Название: Re: Вопросы в С/С++
Отправлено: Alexandr от Март 19, 2009, 11:19:21
Магнетон Бора, сначала пусть гуру подтвердят прав ли я;)
может я наврал :)


Название: Re: Вопросы в С/С++
Отправлено: ZaQ от Март 21, 2009, 01:45:57
в конце строки b должен в обязательном порядке быть 0. т.е. char b = new char[5]; b[4] = 0;
А так это мусор за границей массива.


Название: Re: Вопросы в С/С++
Отправлено: EvilMax от Март 21, 2009, 12:07:57
ZaQ, именно так. Уже выяснили в реале. :)


Название: Re: Вопросы в С/С++
Отправлено: luk4196 от Июнь 08, 2009, 09:29:42
 Не знаю что у тебя случилось мой тебе совет скачай DEV C/C++ 4.9.9.2.
и небудет никаких проблем,вот ссилочка:
http://www.bloodshed.net/dev/devcpp.html сам использую
хотя и новичок в програмировании начал изучать С/С++ . :D

Рекламные ссылочки на депозит идут лесом. В следующий раз будет бан. Alder


Название: Re: Вопросы в С/С++
Отправлено: Артем от Июнь 08, 2009, 11:45:04
Не знаю что у тебя случилось мой тебе совет скачай DEV C/C++ 4.9.9.2.
и небудет никаких проблем
luk4196, читай внимательнее, ошибку в коде Магнетон Бора уже давно описал ZaQ. И среда разработки здесь абсолютно ни при чем !

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


Название: Re: Вопросы в С/С++
Отправлено: tos от Июнь 08, 2009, 11:49:12
Если он его юзает, значит на то есть свои причины.
не хотелось бы начинать оффтоп, но иногда - просто по незнанию


Название: Re: Вопросы в С/С++
Отправлено: pollyfox от Сентябрь 20, 2009, 07:29:22
  Вот, наткнулся при выполнении лабы.
Надо перевести число из х-ичной системы счисления в у-ичную. х и у - задаются пользователем.


не буду говорить, сколько я пытался воплотить свой алгоритм  с бумажки в си, когда узнал про itoa.

Вот я и написал:
Код:
#include<stdio.h>
#include<STDLIB.H>
#include<conio.h>
int main()
{
 clrscr();
   char buff[128];
    int num;
    int st;
  printf("Enter your number\n");
  scanf("%d", &num);

  printf("Enter base number of your new system\n");
  scanf("%d", &st);

itoa(num, buff, st);
printf(buff);
getch();

return 0;
}
Собственно о функции я узнал, но мне ничего не объяснили, и гугл уклоняется от ответа.
Поэтому задаю нашим форумчанам вопрос: "что делает itoa, и как ее заменить на sprintf?"

P.S. программа должна переводить из любой системы счисления в любую.


Название: Re: Вопросы в С/С++
Отправлено: KyDECHuK от Сентябрь 20, 2009, 07:51:10
...
Собственно о функции я узнал, но мне ничего не объяснили, и гугл уклоняется от ответа.
...
Таки уклоняется (http://www.google.com.ua/search?q=itoa&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox) ?! Какой нехороший гугл :))
Первый же линк решит как минимум половину вопроса ;)


Название: Re: Вопросы в С/С++
Отправлено: Артем от Сентябрь 20, 2009, 07:56:33
Леха_Кит, ну где ж ты ему создаешь ?)) Есть же радел "Программирование". А кроме того есть еще отличный сайт - http://www.codenet.ru/ Там классный русскоязычный справочник по функциям.

из х-ичной системы
Ты эта, аккуратнее, а то так и забанить могут)) :D


Название: Re: Вопросы в С/С++
Отправлено: pollyfox от Сентябрь 20, 2009, 08:11:12
KyDECHuK, я был на вики, и на www.cplusplus.com/ там сие:
Код:
#include <stdio.h>
#include <stdlib.h>

int main ()
{
  int i;
  char buffer [33];
  printf ("Enter a number: ");
  scanf ("%d",&i);
  itoa (i,buffer,10);
  printf ("decimal: %s\n",buffer);
  itoa (i,buffer,16);
  printf ("hexadecimal: %s\n",buffer);
  itoa (i,buffer,2);
  printf ("binary: %s\n",buffer);
  return 0;
}
А на вики, к тому же, написано что стоит заменять на sprintf. И я вот не догоню как, и прошу показать на моей программе :)


из х-ичной системы
Ты эта, аккуратнее, а то так и забанить могут)) :D
и правда  :D, так получилось   ::).
а за сайт - спасибо)


Название: Re: Вопросы в С/С++
Отправлено: ZaQ от Сентябрь 20, 2009, 11:29:44
Ну и постановка вопроса, ппц какой-то.
Правило номер раз! Правильный вопрос - половина ответа.

итоа преобразовывает инт в стринг, т.е. тоже что и sprintf(s, _T("%d"), intValue);
пишу по памяти, поэтому могу ошибиться. Разница между принтф и спринтф только в том, что в первом параметре должн быть указатель на буфер необходимой длины.
Ну и принтф и ко позволяет намного шире форматировать вывод.
А вообще мсдн решает, да. РТФМ!


Название: Re: Вопросы в С/С++
Отправлено: ucalculus от Ноябрь 24, 2009, 11:08:42
Вопрос может касается не столько самого С++, но и его тоже. Вот решил таки более-менее основательно подучить язык. И, как все знают, умения и навыки появятся только после выполнения реальных задач. Но в том то и проблема, что не хватает у меня фантазии генерировать какие-то задачи =) Существует ли что-то наподобие Задачника, где будет n задач различной сложности, реализуя которые можно будет повысить свое "мастерство"?


Название: Re: Вопросы в С/С++
Отправлено: Артем от Ноябрь 24, 2009, 11:25:57
ucalculus , вам сюда - Книги по программированию (http://kita.org.ua/index.php/topic,2456.0.html)


Название: Re: Вопросы в С/С++
Отправлено: Alder от Август 14, 2010, 10:28:39
Скорее не вопрос, а просто эдакий хинт, малоизвестный :)

Обычно в С/С++ обращение к элементу массива происходит так:
а[10]
, однако существует еще один малоизвестный, но рабочий способ:
10[a]
Почему это работает? :) Все очень просто:
a[10] = *(a+10)
10[a] = *(10+a)

, а от перестановки мест слагаемых сумма не меняется.


Название: Re: Вопросы в С/С++
Отправлено: broken-wings от Август 14, 2010, 11:41:26
Alder, =)
Забавный хинт, вот так можно запутать незнающих ребят до полного умопомрачения !


Название: Re: Вопросы в С/С++
Отправлено: tos от Август 15, 2010, 11:39:23
оч старый хинт.


Название: Re: Вопросы в С/С++
Отправлено: Alder от Август 15, 2010, 01:10:32
tos, ну никто и не кричит что новый :) Просто малоизвестный.