IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

5 страниц V < 1 2 3 4 > »   
Closed Topic Открыть новую тему 
> Ряд вопрсов по C++.
сообщение
Сообщение #21


Гость






Ну, наверное все-таки потому, что printf не меняет входные параметры, они копируются в стек и выводятся на печать, а scanf как раз-таки должна значения параметров изменить (в этом и состоит ее задача), а сделать это можно только передав ссылку или указатель на аргумент (ссылок в чистом С еще не было, остаются только указатели).
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


Гость






Дейтел. Как программировать на СИ. Очееееень подробная книга. Все очень просто, с примерами и заданиями!
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


Короче вот какой вопрос.У меня есть структура и указатель на нее по ходу выполнения мне надо под нее выделять память.Я решил сначало попробовать на простом примере


struct cel
{
int znac;
char name[NAME];//вот структура
}*CP;


............................................................
CP=(struct cel*)malloc(sizeof(struct cel ));
realloc(CP,2*sizeof(struct cel ));
CP[0].znac=20;
printf("%d",CP[0].znac);
free(CP);//при выполнении данной ф.и вылетает


Сначала выделяю память под 1 элемент.Подом добавляю памяти под второй.Так вот все ли я делаю правильно?И как потом эту память очистить? free(CP) не прокатывает.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #24


Гость






Скажи спасибо альфонсу, который посоветовал прочесть книгу Дейтела... Читай, наверное ее чтение само собой сделает свое дело, и ты больше не будешь задавать вопросов по С++... Там же все очень просто? Ну, так в чем дело?

Читаешь книгу, идешь спать... Проснулся - С++ стал тебе родным... Идиллия, правда? И главное - без усилий с твоей стороны, достаточно только прочитать, ведь "все ОЧЕНЬ просто!" (С) dry.gif

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #25


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


Цитата(volvo @ 29.04.2008 17:40) *

Скажи спасибо альфонсу, который посоветовал прочесть книгу Дейтела... Читай, наверное ее чтение сделает свое дело, и ты больше не будешь задавать вопросов по С++... Там же все очень просто? Ну, так в чем дело?

Да в том что неполучается освободить память после realloc на ф.и free(CP) выдается сообщение о том что обнаружена ошибка.

Добавлено через 2 мин.
Блин ну я и тупой........Всегото надо CP=(struct cel*)realloc(CP,2*sizeof(struct cel ));
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #26


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


Если кому надо могу выложить Дейтела в электронном виде!!!

Сообщение отредактировано: blackhard -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #27


поиск
****

Группа: Пользователи
Сообщений: 347
Пол: Мужской
Реальное имя: nir

Репутация: -  2  +


Я смотрю тема стала очень популярной smile.gif
Извините за флуд.


--------------------
typedef void Śūnyatā ;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #28


поиск
****

Группа: Пользователи
Сообщений: 347
Пол: Мужской
Реальное имя: nir

Репутация: -  2  +


Вот еще попрос в паскале, когда пишешь модуль с обьектом переменные(обекта) видны во всех процедурах и тд.
А в с++ как надо сделать что бы переменная была видна на весь модуль ?


--------------------
typedef void Śūnyatā ;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #29


Гость






В С++ надо описать поле класса общим (в секции public) или пользоваться struct-урами, там поля общие по умолчанию, если не задашь другой метод доступа...

А вообще, это плохой стиль - давать всем подряд обращаться к полям класса. Лучше сделай Getter/Setter этой переменной, и дай им общий доступ, а саму переменную скрой в private-секции (так у тебя будет хоть какой-то контроль за тем, как изменяется поле класса; ведь может быть ситуация, что поле нельзя изменять, и вдруг какая-то посторонняя процедура берет и меняет его... Setter не должен ей этого позволить, если это на данный момент недопустимо)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #30


поиск
****

Группа: Пользователи
Сообщений: 347
Пол: Мужской
Реальное имя: nir

Репутация: -  2  +


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

Сообщение отредактировано: renesko1 -


--------------------
typedef void Śūnyatā ;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #31


Гость






Цитата
Я имею возможность обращатся в метадах обьекта напрямую не записывая в параметры мою переменную.
В методах объекта и в С++ ты можешь общаться со всеми полями напрямую... Разговор был о "снаружи", не правда ли?
Цитата
что бы переменная была видна на весь модуль
(на модуль, а не на класс, чувствуешь разницу?)

Или
class base {
int value;

public:
base(int val = 0): value(val) {}
int getValue() const {
return value;
}
};


и читай переменную, сколько влезет, но записать в нее тебе никто не даст (только изнутри класса или friend-function)... Или, если хочешь программировать в стиле Паскаля:
class base {
public:
int value;

base(int val = 0): value(val) {}
};
или
struct base {
int value;

base(int val = 0): value(val) {}
};
, и работай отовсюду...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #32


поиск
****

Группа: Пользователи
Сообщений: 347
Пол: Мужской
Реальное имя: nir

Репутация: -  2  +


Как всегда помог, да ты прав, постараюсь в след. раз лучше формулировать вопрс. smile.gif


--------------------
typedef void Śūnyatā ;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #33


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской

Репутация: -  0  +


у меня вопрос
когда я должен вводить символы я ставлю условии на неналичие в них цифр
вот так

char name[20];
i:
scanf("%s",name);
for(int i = 0; i<20; i++)
if((name[i]>47) && (name[i]<58))
{gotoxy(x,1);
memset(name,'\0',20);
goto i;}


тут все замечательно

теперь я хочу сделать наоборот вводить цифры с условием на неналичие символов кроме цифровых
вот так

short day[2];
d:
scanf("%d",day);
for(i = 0; i<2; i++)
if((day[i]<48) || (day[i]>57))
{gotoxy(x,2);
memset(day,'\0',2);
goto i;}

но в далном случае прога виснет.
подскажите что не так)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #34


Гость






blink.gif
Ты ж читаешь число, а не строку через scanf("%d"), а работаешь с day, как со строкой? Это во-первых... Во вторых: что за метка?

Достаточно было сделать вот так:
  char buffer[256]; // Это для сбрасывания введенной строки, которая НЕ является числом

int day;

while(!(scanf("%d",&day))) {
gotoxy(x, 2);
day = -1; // Ну, или любое другое значение, неважно
gets(buffer); // убираем из буфера строку, чтобы читать заново
puts("Ошибка. Попробуйте еще раз... ");
};

 К началу страницы 
+ Ответить 
сообщение
Сообщение #35


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской

Репутация: -  0  +


а зачем адрес брать у дня?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #36


Гость






Это ты у разработчиков С спрашивай, зачем им понадобилось, чтобы scanf работала с адресами... Наверное, чтобы введенное значение можно было вернуть из функции. Иначе зачем scanf вообще нужна?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #37


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


А если у ф.и вот такой протатип
int sum2(int k,int(*p)(int,...),...)
(где k количество параметров).Как мне внутри этой ф.и передать необязательные параметры ... в ф.ю на которую указывет этот указатель int(*p)(int,...), и в которой тоже переменное число параметров?Можно так вообще сделать или нет?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #38


Гость






Цитата
Можно так вообще сделать или нет?
Можно... Вот так, например:
#include <stdio.h>
#include <stdarg.h>

typedef int (*myFunc)(int ...);

int t(int k ...) {
int sum = 0;

va_list vL;
va_list *pvL;

va_start(vL, k);
pvL = va_arg(vL, va_list*);

for(int i = 0; i < k; i++) {
sum += va_arg(*pvL, int);
}
va_end(vL);
return sum;
}

int s(int k, myFunc f ...) {
va_list vL;
va_start(vL, f);
int result = f(k, &vL);
va_end(vL);

return result;
}

int main() {
int i = s(5, t, 10, 20, 30, 40, 150);
printf("%d\n", i);
return 0;
}
 К началу страницы 
+ Ответить 
сообщение
Сообщение #39


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Вопрос #7
Вот есть программа, от которой я хотел бы составление последовательностей и вывод этого чуда.. Но увы она этого не делает( Наверно опять начудил с индексами.. Помогите..
#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;
int main(void){
const int number_el(6); //количество элементов
const int number_seq(6); //количество последовательностей

vector<int> fibonacci(number_el);//ряд Фиббоначи
fibonacci[0]=1;
fibonacci[1]=1;
for(int i(2); i<number_el; ++i)
fibonacci[i]=fibonacci[i-2]+fibonacci[i-1];

vector<int> lucas(number_el);//ряд Лукаса
lucas[0]=1;
lucas[1]=3;
for(int i(2); i<number_el; ++i)
lucas[i]=lucas[i-2]+lucas[i-1];

vector<int> pell(number_el);//ряд Пелла
pell[0]=1;
pell[1]=2;
for(int i(2); i<number_el; ++i)
pell[i]=pell[i-2]+2*pell[i-1];

vector<int> triangular(number_el);//ряд Треугольных чисел
for(int i(0); i<number_el; ++i)
triangular[i]=(int)(0.5*(i*i+3*i+2));

vector<int> square(number_el);//ряд Квадпатных чисел
for(int i(0); i<number_el; ++i)
square[i]=i*i+2*i+1;

vector<int> pentagonal(number_el);//ряд Пятииугольних чисел
for(int i(0); i<number_el; ++i)
pentagonal[i]=(int)((3*i*i+5*i+2)/2);;

vector<int> *seq_addrs[ number_seq ]={
&fibonacci, &lucas, &pell, &triangular, &square, &pentagonal
};


/*string seq_names[ number_seq ] = {
"Фибоначчи", "Лукас", "Пелл", "Треугольный", "Квадратгый", "Пятиугольный"
};*/

for(int i(0); i<number_seq; ++i){
for(int j(0); i<number_el; ++j)
cout << (*seq_addrs[i])[j] << '\t';
cout <<'\n';
}

cout << "Ok\n";
return 0;
}


заранее благодарен.

upd
подправлены формулы для треугольных и квадратных чисел, добавлено явное привидение типов.

Сообщение отредактировано: compiler -


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #40


Гость






		for(int i(0); i<number_seq; ++i){
for(int j(0); i<number_el; ++j) // Тут точно все, как надо? Может I не нужно?
cout << (*seq_addrs[i])[j] << '\t';
cout <<'\n';
}
Кстати, обрати внимание на предупреждение... Лучше приводить результат к типу int явным образом...
 К началу страницы 
+ Ответить 

5 страниц V < 1 2 3 4 > » 
Closed Topic Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 25.04.2024 15:23
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name