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

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

Автор: Mr Nobody
Дата сообщения: 05.11.2007 20:29
WiseAlex
Вы правы.Вот я написал программку на Борланде

Код:
#include <stdio.h>

int array_s[12] = {71, 2, 34, 84, 15, 6, 73, 18, 39, 10, 11, 23};

int main()
{
    int array_a[12] = {71, 2, 34, 84, 15, 6, 73, 18, 39, 10, 11, 23};
    int ii;

    for(ii = 0; ii < 12; ii++)
        printf("address: %p\n", &array_s[ii]);

    return 0;
}
Автор: FMeat
Дата сообщения: 05.11.2007 21:18
Всем спасибо. Моя проблема решана благодоря вам.
Автор: WiseAlex
Дата сообщения: 06.11.2007 11:38
Mr Nobody

Цитата:
А что в С это нарушило бы?

итерация по массиву с помощью указателя и операции ++ да и вообще вся адресная арифметика с таким массивом пошла бы гулять
Автор: Mr Nobody
Дата сообщения: 06.11.2007 17:46
WiseAlex

Цитата:
итерация по массиву с помощью указателя и операции ++ да и вообще вся адресная арифметика с таким массивом пошла бы гулять

Точно, вспомнил, Это у меня и нарушалось.
Автор: BattleMage
Дата сообщения: 07.11.2007 21:08
Здравствуйте, товарищи. Доброго времени суток!
У меня возникла такая проблема: как вообще пользоваться графикой в Си под ДОСом (Borland C++ 3.1)
библиотеку graphics.h включать умею :)

Скопировал прогу из хелпа стандартного, но она не пашет.
Ошибки такие:
undefined symbol _closegraph() in module ...\BAR.cpp
undefined symbol _bar() in module ...\BAR.cpp
undefined symbol _grapherrormsg() in module ...\BAR.cpp
и так далее...

Текст проги такой:

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

void main()
{
/* request auto detection */
int gdriver = DETECT, gmode, errorcode;
int midx, midy, i;

/* initialize graphics and local variables */
initgraph(&gdriver, &gmode, "");

/* read result of initialization */
errorcode = graphresult();
/* an error occurred */
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
return;
/* terminate with an error code */
}

midx=320;
midy=240;
// midx = getmaxx() / 2;
// midy = getmaxy() / 2;

/* loop through the fill patterns */
for (i=SOLID_FILL; i<USER_FILL; i++)
{
/* set the fill style */
// setfillstyle(i, getmaxcolor());
/* draw the bar */
bar(midx-50, midy-50, midx+50, midy+50);
getch();
}

/* clean up */
closegraph();
return;
}
Автор: Abs62
Дата сообщения: 07.11.2007 21:20
BattleMage

Цитата:
библиотеку graphics.h включать умею

Не похоже.
Options -> Linker -> Libraries -> Graphics library (поставить галку).
Автор: BattleMage
Дата сообщения: 07.11.2007 22:34
Пасиба большое!!!

Добавлено:
А как рисовать прямоугольники разными цветами?


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

void main()
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "d:\\BC\\BGI");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\nPress any key to halt:", grapherrormsg(errorcode));
getch();
return;
}
bar(0,0,160,480);
bar(320,0,480,480);
getch();
return;
}
Автор: Abs62
Дата сообщения: 08.11.2007 19:35
BattleMage

Цитата:
А как рисовать прямоугольники разными цветами?

Использовать setfillstyle, задав нужный цвет и шаблон заполнения перед вызовом bar.
Автор: sergeyt
Дата сообщения: 11.11.2007 14:50
У меня непроходит компиляция что делать

{
if (_CrtReportBlockType(ptr) == P_CLIENT_BLOCK) {
const PObject * obj = (PObject *)ptr;
_RPT1(_CRT_WARN, "Class %s\n", obj->GetClass());
hadCrtDumpLeak = true;
}

if (pfnOldCrtDumpClient != NULL)
pfnOldCrtDumpClient(ptr, size);
}

Далее ошибка

Compiling...
object.cxx
C:\ptlib\src\ptlib\common\object.cxx(1093) : error C2065: '_CrtReportBlockType' : undeclared identifier
C:\ptlib\src\ptlib\common\object.cxx(1095) : warning C4127: conditional expression is constant
Автор: Lyrik
Дата сообщения: 11.11.2007 15:15
sergeyt
А инклуд <crtdbg.h> сделан?
Автор: sergeyt
Дата сообщения: 11.11.2007 15:31
Я не очень в программировании
легче просто написать как да что

Добавлено:
В начале этот инклуд прописан
Автор: TimAlexandr
Дата сообщения: 11.11.2007 21:14
Памагите плиз!!! Программа написанная в С++ в линуксе не компилируеться! Но в Windows все работает. Что делать???
Автор: Paul Tergeist
Дата сообщения: 11.11.2007 21:53
TimAlexandr
Телепаты все в отпуске. Покажи код, где не компилируется.
Автор: Mr Nobody
Дата сообщения: 12.11.2007 00:05
TimAlexandr

Цитата:
Но в Windows все работает. Что делать???

Не тяжело догадаться, работай в Windows. Это показывает, что Линукс эще весьма "сырой"
Автор: BornLeader
Дата сообщения: 12.11.2007 10:25
Код покажи!Какие функции используешь?
Автор: diaz85
Дата сообщения: 15.11.2007 17:30
Добрый день. есть небольшой вопрос:

r=bind(s, const struct socketaddr far*name, int namelen),

что такое far? name вроде как указатель на стр-ру, а вот far...
Автор: Lyrik
Дата сообщения: 15.11.2007 17:45
diaz85

Цитата:
что такое far?

дальний указатель, т.е. сегмент:смещение
Автор: BlackBerry
Дата сообщения: 16.11.2007 16:50
Можно ли в C/C++ определить смещение эленента структуры ?
struct my_struct { int n;
.....
int k;
}
offset (my_struct.k) - ?
Автор: Paul Tergeist
Дата сообщения: 16.11.2007 20:20
BlackBerry

Код: #include <cstddef>
....
struct my_struct {
int n;
.....
int k;
};
....
size_t o = offsetof(my_struct, my_struct::k);
Автор: kastus777
Дата сообщения: 17.11.2007 23:00
разобрался - надо вместо 1 вводить 01 и.т.д

/*доброго времени суток


if (strcmp(bus.punktnaz,gorod)==0){
if (strcmp(temp,bus.timeprib)>0)

{printf("\n temp=%s bus.timeprib=%s\n",temp,bus.timeprib);

}
}
перебор по городу и времени прибытия
по городу нормально работает , а по (strcmp(temp,bus.timeprib)>0)
выдает какую-то чушь- если задаю temp (0...9) выводит весь список, если двузначное ,то не видет однозначные числа

подскажите как спавиться
спасибо


Автор: alex5161
Дата сообщения: 18.11.2007 01:53
Всем привет!
Нуждаюсь в помощи.
Проблема в компилировании, точнее в линковании, но из компиляции. Или причина в Вижуал Студии оболочке самой по-себе.
Всего кода представить немогу - пол-гига в целом.
Суть в том, что мне нужно програмировать дополнительную часть и подключать как статические библиотеки.
Когда я подключаю успешно откомпелированную Try2_sttc_lib_6.lnk с функцией displ(..), к существующему коду, линкер жалуется, что

НЕ МОЖЕТ РАЗРЕШИТЬ EXTERNAL СИМВОЛ _displ.

Тот же код, тем же образом использованный в новосозданной программке (win32 consol application project) компилируется и работает без проблем.

Програмка с функцией displ() компиликованна как static library project в Try2_sttc_lib_6.lnk.
Я ведь не ошибаюсь, что компилирование в *.lnk это то же, что и компилирование в об'ектный код, *.obj?
Далее в существующей программе бобавленно
external void displ(char* stn);
и использованно уже в main().

Более точно, в проверочном проэкте использованно в main(), а в существующем проэкте - в winmain(..)

Существующий проэкт написан полностью на Си, а коммпилирован в VC++ ver.6
Проделано ли что-то специальное в компиляции для этого, я не знаю. Для меня Вижуал Студия не знакома, я от Юникса, и поэтому не знаю как разобратся со всей компиляцией в VS-v.6
Проверочный код банален:
Библиотека:
// Try2_sttc_lib_6.cpp

//#include <iostream>
//using namespace std;

#include <stdio.h>

void displ(char* stn)
{
    //cout << "\nFrom 'displ' library: " << stn << "\n";
    printf("\nFrom 'displ' library: %s \n", stn );
}
Использование:
// use_lib.cpp :
//

#include <stdio.h>

extern
void displ(char*);

int main(int argc, char* argv[])
{
    displ("using static library");

    return 0;
}
Автор: Lyrik
Дата сообщения: 18.11.2007 10:37
alex5161
Такое обычно возникает когда компилирование библиотеки и исходных текстов происходит под разной спецификацией, у тебя видно, что библиотека компилилась как С, а исходные коды как С++, имхо. Решение следующее:

Код: //#include <iostream>
//using namespace std;

#include <stdio.h>

extern "C" void displ( char* );

void displ(char* stn)
{
//cout << "\nFrom 'displ' library: " << stn << "\n";
printf("\nFrom 'displ' library: %s \n", stn );
}
Автор: alex5161
Дата сообщения: 18.11.2007 22:05
Lyrik -Спасибо, проверил. Поставил "С" в об'явление функции в файле с WinMain(..):
и получил другую ошибку, и как я понял, на "С":

error C2059: syntax error : 'string'

Из поиска пришел к выводу, что проблемма была в том, что библиотека компилировалась из фаила '*.cpp'(созданного по-умолчанию), а существующий проект из файлов '*.с'
(В моем проверочном проэкте тоже создался файл 'cpp', потому и небыло проблем с external об'явлением.)
Когда я поменял расширения на *.с библиотека принята существующим проектом без проблем.

Т.е. с этим разобрался. Спасибо Lyrik за пинок в правильном направлении

Теперь другая проблема:
А можно ли С++ (не только С) код использовать из библиотеки?
Т.е. писать на С++, компилировать в new_code.lib, и подключать к существующему тем же образом, через extern?
Или каким другим образом?

Я попробовал использовать cout << (конечно с #include <iostream> using namespace std;) но получил ошибку:
fatal error C1189: #error : "eh.h is only for C++!"

Как такое сделать?

- ПОЛУЧИЛОСЬ!!
Т.е сделал функцию на С++, в файле *.срр , откомпелировал в библиотеку (т.е в MS VS-6 это Win32 Static Library project), и использовал эту функцию из С проэкта.
А для этого понадобилось 2 вещи:
1. 'extern "C" ' перед имплементацией библиотечной функции:
extern "C" void displ(char* stn) { .... code ... )
2. точное совпадание типа компиляции, что подключает соответствующие библиотеки. Иначе конфликты.
в MSVS-v.6 это в project/setting: C/C++: code generation category; Use-run time library:
Ну а после этого - как обычно: подключил *.lib к существующему (добавил файл к проэкту) и об'явил екстернал библиотечную функцию. Все - можно пользовать.
Конечно, исключительно С++ (overloading, template, virtual funcs, что там еще...) использовать если и можно изловчится, но будет геморойно. Ну а так - нечто.
Автор: soyfuerte
Дата сообщения: 21.11.2007 12:02
добрый день! помогите, пожалуйста,с задачкой... очень прошу


Дан 2-мерный массив целых чисел(М строк, N столбцов, М=5, N=4). Элементы вводят с клавиатуры. Вывести массив на экран в виде таблицы. Определить количество элементов, кратных 3 и не превышающих 100. Посчитать среднее арифметическое в К-ом столбце. Найти первый максимум и его координаты в каждой строке. Вывести на экран. Упорядочить массив максимумов по возрастанию.

заранее благодарна.
Автор: Lyrik
Дата сообщения: 21.11.2007 14:22
alex5161

Цитата:
что проблемма была в том, что библиотека компилировалась из фаила '*.cpp'(созданного по-умолчанию), а существующий проект из файлов '*.с'

это я и писал

Цитата:
компилирование библиотеки и исходных текстов происходит под разной спецификацией, у тебя видно, что библиотека компилилась как С, а исходные коды как С++


Цитата:
ПОЛУЧИЛОСЬ!!

вот и гут!
soyfuerte
В этой теме - вопросы. Что конкретно у тебя не получается?
Автор: distance
Дата сообщения: 21.11.2007 22:13
soyfuerte

Цитата:
Определить количество элементов, кратных 3 и не превышающих 100

подсчет можно сделать так:


Код: #include <algorithm>

    const int M = 5; // rows
    const int N = 4; // columns

    int array[M][N];
    
    // заполнение массива
    // ...
    
    int* p = &array[0][0];
    struct Op : public std::unary_function<int, bool>
    {
        result_type operator()(const argument_type& v)
        {
            return ((v % 3 == 0) && (v <= 100));
        }
    };

    std::count_if(p, p + M*N, Op());
Автор: soyfuerte
Дата сообщения: 22.11.2007 11:03
Дан 2-мерный массив целых чисел(М строк, N столбцов, М=5, N=4). Элементы вводят с клавиатуры. Вывести массив на экран в виде таблицы. Определить количество элементов, кратных 3 и не превышающих 100. Посчитать среднее арифметическое в К-ом столбце. Найти первый максимум и его координаты в каждой строке. Вывести на экран. Упорядочить массив максимумов по возрастанию.

вот я вывела на экран.... а как условие создать, чтобы было кратно 3???


#include<iostream.h>
#include<conio.h>
#include<iomanip.h>
void main()
{
clrscr();
const int M=5, N=4;
double d[M][N];//vveli massiv d
for (int i=0; i<M; i++)
for (int j=0; j<N; j++)
{
cout<<"VVesti element stroca"<<i<<"stolbec"<<j;
cin>>d[i][j];
}
for (i=0; i<M; i++)
{
for (int j=0; j<N; j++)
cout<<setw(5)<<setprecision(5)<<d[i][j];
cout<<endl;
}
getch();
}
Автор: Qraizer
Дата сообщения: 22.11.2007 20:13
Брать у лояльных в блондинкам друзей готовые исходники - это и моя дочь сможет, хоть она и не блондинка во всех смыслах. Прости, но быть так близко от ответа и не найти мозгов самостоятельно его найти - это нонсенс.
Автор: alex5161
Дата сообщения: 22.11.2007 23:49
soyfuerte
Подскажу о кратности: посмотри, что такое оператор %
Могла бы подумать, что там distance пытался показать, что такое ...(v % 3 == 0) ... и ...
(lm::_1 % 3 == 0)...
(хотя, конечно, distance, ты, похоже, специализируешься в кодовых изошрениях!)

А вообще возникает вопрос: soyfuerte - а зачем оно тебе, если такое вызывает у тебя трудности? Зачем тебе програмирование?
Потому и Qraizer расстраивается, и сотни других, прочитавших, чертыхнувшихся и промолчавших.

Програмирование - это детализация и 'зри в корень' подход.
Сказали 'кратно..' - тебе изложить 'что такое кратно', первый максимум - так же, что это?
Сразу по тексту твоя задача решается так:

Получить массив с ввода
Показать массив на экране (а не во время ввода!)
Пройти по массиву и просчитать элементы кратные 3-м и меньше 100
элементов = 0;
Цикл по всем элементам;
если текущий элемент кратен 3 и < 100 - увеличить 'элементов';
Показать 'элементов' на экран
(остальные подзадачи можно сделать в этом же проходе по массиву, но для начала и простоты лучше сделать отдельные перелистывания массива (что, я думаю, понятно, есть двойной цикл)
Пройти по столбцу К и вычислить среднее арифметическое: наверно вывести на экран? Неуказанно. К - откуда берется? Или запрашивается у пользователя, или входной параметр (и тогда имеется в виду написание функции), или как-то еще (например, генератором случайных чисел). Или уточнить, или указать, какое решение принято.
сумма_К = 0;
Цикл по столбцу К
добавить текущий элемент к сумме_К ;
показать (сумма_К деленную на количество элементов в столбце);
Пройти по массиву и в каждой строке запомнить первый максимум (наверно, первый - для случая, если максимальное значение встречается более одного раза) с координатами (выводить максимум и координаты на экран, запоминать максимум в новый массив.)
об'явить массив максимумов;
максимум = первому елементу в массиве;
Цикл по всему массиву (введенному)
В начале строки : максимум = первому елементу строки;
координаты_максимума = номер_строки, 1;
если текуший элемент > максимума:
максимуm = текущему элементу
координаты_максимума = номер_строки, номер текущего элемента
В конце строки : сохранить максимум текущей строки в массиве максимумов
Вывести на экран текущий максимум и координаты максимума
Отсортировать массив максимумов по возрастанию (можно писать процедуру самому, или использовать библиотечные функции - надо поискать) Ну и вывести на экран.
Самому - например пузырьком:
Пройтись по массиву максимумов, начиная со второго элемента:
если текущий элемент < предыдущего - поменять их местами
Проделать такой проход на один раз меньше, чем количество элементов в массиве.
Распечатать отсортированный массив.

Ну и все.
Осталась только кодировка.

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

Автор: ExtazY_13
Дата сообщения: 25.11.2007 02:20
ПОМОГИТЕ РЕШИТЬ ЗАДАЧКУ, ПЛИЗ....
СКОРО КУРСАЧ, А ОНА НЕ ФУРЫЧИТ....

"ПРОВЕРИТЬ, ЯВЛЯЕТСЯ ЛИ МАТРИЦА МАГИЧЕСКИМ КВАДРАТОМ(ТО ЕСТЬ СУММА ВО ВСЕХ СТРОКАХ И СТОЛБЦАХ ОДИНАКОВА)"

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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