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

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

Автор: karakurt2
Дата сообщения: 22.05.2010 18:30
pj7cecv

BOOL ShowWindow(HWND hWnd,
int nCmdShow
);
Автор: Pr1nt
Дата сообщения: 28.05.2010 23:37
Возможно вы сможете помочь мне победить ошибку в учебной задаче:
Вкратце: Программа нахождения математического ожидания для данных находящихся в буфере.
(Выполняется под Ubuntu, GCC 4.4.3)

[more=test.c]#include <stdio.h>
#include <errno.h>
#include <sys/wait.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <ncurses.h> //подключаем библиотеку ncurses

int array[3]; /* Указатель на разделяемую память */
int M=0, W=0;
int myrand(int a, int b) // генерацияслучаынйх чисел
{
    return rand()%(b-a)+a;
}
int a=0;

void myprint(int x,int y, char * str){
    sleep(0);
    move(0,0);
    printw("a=%d",a); // вывод строки
    a++;
    move(x,y);
    printw(str); // вывод строки
    refresh(); // обновить
}

void p_action (int sig){}
void write_action (int sig){}

/***********************************************************************/
int main(void){

    int N, T;
    int Xmin=0, Xmax=0, n=1, sum=0;

    printf("N=");
    scanf("%d",&N);

    int L=512;
    printf("L=");
    scanf("%d",&L);

    printf("T=");
    scanf("%d",&T);


    // инициализация (должна быть выполнена перед использованием ncurses)
    initscr();
    clear();
    myprint(0,0,"");
    char str[25];

    sprintf(str,"N=%d T=%d", N, T);
    myprint(3,0,str);
    sprintf(str,"L=%d ",L);
    myprint(4,0,str);


    sprintf(str,"PID N status ");
    myprint(6,0,str);
    sprintf(str,"Xmin Xmax. n ");
    myprint(6,18,str);
    sprintf(str,"expected value ");
    myprint(6,36,str);
    sprintf(str,"frequency (write/read)");
    myprint(6,54,str);
    pid_t pids[N];
    pid_t ppid;

    void p_action (int), write_action (int), read_action (int);
    static struct sigaction pact, cact, cract;

    int i,k;

    /*******************************************/

    int shmid; // IPC дескриптор для области разделяемой памяти */
    int new = 1; // Флаг необходимости инициализации элементов массива */
    char pathname[] = "1.c"; // Имя файла, используемое для генерации ключа. Файл с таким именем должен существовать в текущей директории */
    key_t key; // IPC ключ */
    // Генерируем IPC ключ из имени файла 06-1a.c в текущей директории и номера экземпляра области разделяемой памяти 0 */
    if((key = ftok(pathname,0)) < 0){
        sprintf(str,"4Cant generate key");
        myprint(0,0,str);
        exit(0);
    }
    /* Пытаемся эксклюзивно создать разделяемую память для сгенерированного ключа, т.е. если для этого ключа она
    уже существует, системный вызов вернет отрицательное значение. Размер памяти определяем как размер массива
    из трех целых переменных, права доступа 0666 - чтение и запись разрешены для всех */
    if((shmid = shmget(key, L*sizeof(int), 0666|IPC_CREAT|IPC_EXCL)) < 0){
        /* В случае ошибки пытаемся определить: возникла ли она из-за того, что сегмент разделяемой памяти уже существует или по другой причине */
        if(errno != EEXIST){
            /* Если по другой причине - прекращаем работу */
            sprintf(str,"3Can't create shared memory");
            myprint(0,0,str);
            exit(0);
        } else {
            /* Если из-за того, что разделяемая память уже существует, то пытаемся получить ее IPC
            дескриптор и, в случае удачи, сбрасываем флаг необходимости инициализации элементов массива */

            if((shmid = shmget(key, L*sizeof(int), 0)) < 0){
                sprintf(str,"2Can't find shared memory");
                myprint(0,0,str);
                exit(0);
            }
            new = 0;
        }
    }
    /* Пытаемся отобразить разделяемую память в адресное пространство текущего процесса. Обратите внимание на то, что для правильного сравнения мы явно преобразовываем значение -1 к указателю на целое.*/

    if((array = (int *)shmat(shmid, NULL, 0)) == (int *)(-1)){
        sprintf(str,"1Can't attach shared memory");
        myprint(0,0,str);
        exit(0);
    }
    /*******************************************/

    // создаем процессы
    for (i=0; i < N; i++){
        switch(pids[i]=fork())
        {
            case -1 :{
                sprintf(str,"fork error");
                myprint(0,0,str);
                exit(-1);
            }
            case 0 :{
                Xmin = myrand(1,500);
                Xmax = myrand(Xmin+10,512);

                /*Zadaem obrabotchik v dochernem processe*/
                cact.sa_handler = write_action;
                sigaction (SIGUSR1, &cact, NULL);

                sprintf(str,"%d %d pause",getpid(),i+1);
                myprint(i+7,0,str);
                pause();
                if(i < (int)(N/3) || (N==2 && i==0)){
                    // процессы записывающие в память

                    for(;;){
                        Xmin = myrand(1,500);
                        Xmax = myrand(Xmin+10,512);
                        n++;
                        sum=myrand(Xmin+i,Xmax+i)+myrand(Xmin-i,Xmax+i)+myrand(Xmin+i,Xmax-i);

                        M = sum / n;
                        W = a;
                        sprintf(str,"%d %d write ",getpid(),i+1);
                        myprint(i+7,0,str);
                        sprintf(str,"%d %d %d", Xmin, Xmax, n);
                        myprint(i+7,18,str);
                        sprintf(str,"%d ", M);
                        myprint(i+7,36,str);
                        sprintf(str,"%d ", W);
                        myprint(i+7,54,str);

                        array[0]=myrand(Xmin,Xmax);
                        array[1]=myrand(Xmin,Xmax);
                        array[3]=myrand(Xmin,Xmax);

                        sleep(1);
                        kill (getppid (), SIGUSR2); // посылка родительскому процессу сигнала.
                        sprintf(str,"%d %d pause ",getpid(),i+1);
                        myprint(i+7,0,str);
                        pause();
                    }
                }
                else
                {
                    // процессы считывающие и расчитывающие
                    for(;;){
                        sprintf(str,"%d %d read/take ",getpid(),i+1);
                        myprint(i+7,0,str);

                        sum=myrand(Xmin+i,Xmax+i)+myrand(Xmin-i,Xmax+i)+myrand(Xmin+i,Xmax-i);

                        M = sum / n;
                        W = a;

                        sprintf(str,"%d %d read/take ",getpid(),i+1);
                        myprint(i+7,0,str);
                        sprintf(str," - - - ");
                        myprint(i+7,18,str);
                        sprintf(str,"%d ", M);
                        myprint(i+7,36,str);
                        sprintf(str,"%d ", W);
                        myprint(i+7,54,str);

                        sleep(1);

                        kill (getppid (), SIGUSR2); // посылка родительскому процессу сигнала.

                        sprintf(str,"%d %d pause ",getpid(),i+1);
                        myprint(i+7,0,str);
                        pause();
                    }
                }
                i=N;
                break;
         }
        default :
            /*Zadaem obrabotchik signala SIGUSR2 v roditel'skom processe*/
            pact.sa_handler = p_action;
            sigaction (SIGUSR2, &pact, NULL);
            if(i==(N-1)){// когда запущены все процссы начинаем работать с буфером.

                i=0; // первоначальное значение i для записи данных в пямять
                for(;;){
                    kill (pids[i], SIGUSR1);
                    i=myrand(0,N); // выбор случайного потока
                    pause ();
                }
                // завершение всех процессов
                for(i = 0; i < N; i++) waitpid(pids[i], NULL, 0);

                /* удаляем разделяемую память из адресного пространства текущего процесса и завершаем работу */
                if(shmdt(array) < 0){
                    sprintf(str,"Cant detach shared memory");
                    myprint(0,0,str);
                    exit(-1);
                }
            }
        }
    }
    endwin(); // завершение работы с ncurses
    return 0;
}[/more]

Ошибка: строка 114: error: incompatible types when assigning to type ‘int[3]’ from type ‘int *’
Автор: RedLord
Дата сообщения: 28.05.2010 23:49
Pr1nt
на вскидку
int array[3]; /* Указатель на разделяемую память */

это массив int

возможно так
int* array;
Автор: 4ygynOK
Дата сообщения: 29.05.2010 01:08
Есть задача: необходимо считать данные из файла и при этом наложить на них ключ по XOR-у причём ключ храниться в массиве из 16 элементов!!
У меня вышла вот такая вот штука: но она чёта нифига не работает!! Заранее спасибо!!

    char *d_vxod;
    char *d_rez;
    int i=0;

    d_vxod=new char [1000];
    if (d_vxod<=0){
        printf("Error!!!");
    }
    d_rez=new char [1000];
    if (d_rez<=0){
        printf("Error!!!");
    }

    union Char4un {
unsigned char k[16]; };
    union Char4un key;
    key.k[0]=0x01;
    key.k[1]=0x23;
    key.k[2]=0x45;
    key.k[3]=0x67;
    key.k[4]=0x89;
    key.k[5]=0xAB;
    key.k[6]=0xCD;
    key.k[7]=0xEF;
    key.k[8]=0x00;
    key.k[9]=0x11;
    key.k[10]=0x22;
    key.k[11]=0x33;
    key.k[12]=0x44;
    key.k[13]=0x55;
    key.k[14]=0x66;
    key.k[15]=0x77;
    file = fopen( file_name, "r" );
            if(file!=NULL){    
            printf("Text iz fila:\n");
                            
                    for (int j=0;j<sizeof(d_vxod);j++){
                        d_vxod[j]=getc(file);
                        for (int s=0;s<sizeof(key.k);s++){
                            d_vxod[j]=d_vxod[j]^key.k[s];
                        
                        putchar(d_vxod[j]);
                        d_vxod[j]=getc(file);
                        }
                
                    }
                delete d_vxod;
                delete d_rez;
                printf("\n");
            }
            else{
                printf("File not found !!!\n");
            }
        fclose(file);
Автор: Pr1nt
Дата сообщения: 29.05.2010 09:09
RedLord
Пробовал, все равно:

Ошибка: строка 114: error: incompatible types when assigning to type ‘int *[3]’ from type ‘int *’

Если указалель на разделяемую память изменить так:
int* array
Все равно не идет:

Код: gcc test.c -o test
test.c: In function 'main':
test.c:88: warning: incompatible implicit declaration of built-in function 'exit'
test.c:99: warning: incompatible implicit declaration of built-in function 'exit'
test.c:107: warning: incompatible implicit declaration of built-in function 'exit'
test.c:117: warning: incompatible implicit declaration of built-in function 'exit'
test.c:128: warning: incompatible implicit declaration of built-in function 'exit'
test.c:224: warning: incompatible implicit declaration of built-in function 'exit'
/tmp/cchudxG2.o: In function `myprint':
test.c:(.text+0x34): undefined reference to `stdscr'
test.c:(.text+0x4c): undefined reference to `wmove'
test.c:(.text+0x61): undefined reference to `printw'
test.c:(.text+0x73): undefined reference to `stdscr'
test.c:(.text+0x89): undefined reference to `wmove'
test.c:(.text+0x94): undefined reference to `printw'
test.c:(.text+0x99): undefined reference to `stdscr'
test.c:(.text+0xa1): undefined reference to `wrefresh'
/tmp/cchudxG2.o: In function `main':
test.c:(.text+0x15e): undefined reference to `initscr'
test.c:(.text+0x163): undefined reference to `stdscr'
test.c:(.text+0x16b): undefined reference to `wclear'
test.c:(.text+0xbaa): undefined reference to `endwin'
collect2: ld returned 1 exit status
Автор: RedLord
Дата сообщения: 29.05.2010 16:48

Цитата:
test.c.text+0x34): undefined reference to `stdscr'
test.c.text+0x4c): undefined reference to `wmove'
test.c.text+0x61): undefined reference to `printw'
test.c.text+0x73): undefined reference to `stdscr'
test.c.text+0x89): undefined reference to `wmove'
test.c.text+0x94): undefined reference to `printw'
test.c.text+0x99): undefined reference to `stdscr'
test.c.text+0xa1): undefined reference to `wrefresh'
/tmp/cchudxG2.o: In function `main':
test.c.text+0x15e): undefined reference to `initscr'
test.c.text+0x163): undefined reference to `stdscr'
test.c.text+0x16b): undefined reference to `wclear'
test.c.text+0xbaa): undefined reference to `endwin'

Pr1nt

с gcc не работал, но повидимому, это сообщения линковщика.
не хватает какой-то либы

Цитата:
incompatible implicit declaration of built-in function 'exit'


добавь #include <stdlib.h>
Автор: Pr1nt
Дата сообщения: 29.05.2010 17:12
RedLord, спасибо, лишним не будет
Но это помогло избавиться только от warning'ов:

Код: test.c: In function 'main':
test.c:88: warning: incompatible implicit declaration of built-in function 'exit'
...
Автор: RedLord
Дата сообщения: 29.05.2010 17:32
wmove, initstr и др. - что за функции?
Автор: karakurt2
Дата сообщения: 29.05.2010 19:19
Pr1nt
компилируйте вот так:

Цитата:

sh -c "gcc z1.c -o z1.exe -lncurses"


очень херово написан код у Вас
Автор: Pr1nt
Дата сообщения: 30.05.2010 19:56
karakurt2, спасибо большое, так все получилось.
Автор: pj7cecv
Дата сообщения: 31.05.2010 10:22
Здравствуйте у меня прога на Visual С++ написана 14 диалоговых окон, мне необходимо по кнопке далее чтобы предыдущее диалоговое окно закрылось а другое открылось, подскажите пожалуйста какой код написать в обработчике события нажатия на кнопку?)))))))По нажатии открыть другое диалоговое окно, я начинающий специалист плиз помогите)))
Автор: karakurt2
Дата сообщения: 31.05.2010 14:33
pj7cecv
Вот так ещё не пробовали?


Код:
void CDialog1::OnButton1()
{
ShowWindow(SW_HIDE);
pDialog2->ShowWindow(SW_SHOW);
pDialog2->UpdateWindow();
}
Автор: pj7cecv
Дата сообщения: 01.06.2010 14:36
void Dialog15::OnButton3()
{
    Dialog15 k(IDD_DIALOG3);
    k.DoModal();
}


написала вот такую процедуру, что значит ошибка вот такая выходит :
error C2664: 'Dialog15::Dialog15' : cannot convert parameter 1 from 'const int' to 'class CWnd *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast



написала вот в таком виде:


void CIPMDDlg::OnButton1()
{
CDialog about1(IDD_DIALOG15);
about1.DoModal();
}
все прекрасно работает

В чем проблема?????

Автор: karakurt2
Дата сообщения: 02.06.2010 04:30
pj7cecv
видимо, не реализован нужный конструктор. смотрите и сравнивайте объявления Вашего класс и класса, предоставляемого библиотекой.
Автор: TargeTSan
Дата сообщения: 07.06.2010 21:36
pj7cecv
Начнём с кусочка статьи про CDiaog construction из MSDN

Код:
explicit CDialog(
LPCTSTR lpszTemplateName,
CWnd* pParentWnd = NULL
);
explicit CDialog(
UINT nIDTemplate,
CWnd* pParentWnd = NULL
);
CDialog( );
Автор: Geist7
Дата сообщения: 08.06.2010 10:46
Я пытаюсь изменить файл в папке Windows (OS Windows 7). При попытке изменения вываливается ошибка 0x00000005 (Отказано в доступе). Как легально выкинуть запрос UAC на админские права?
Автор: zQuatroz
Дата сообщения: 10.06.2010 13:26
Ну тогда верну примерно как было =)
Дело было в VS2008 C++

Надо было конвертировать из array<unsigned char>^ в unsigned char *
Способы потом были найдены, но до их нахождения решил сам, может и не так изящно, зато просто =) Примерно вот так:


Цитата:

array<unsigned char>^ frwBuf = gcnew array< unsigned char >(4);
unsigned char * tmp = new unsigned char;
            
for (int i =0; i < blockSize; i++)
{                    
tmp[i] = frwBuf[i];
}



Автор: karakurt2
Дата сообщения: 10.06.2010 17:57
zQuatroz
а зачем удалили?
написали бы здесь Ваше решение.
авось кому-нибудь и пригодилось бы.
или религия не позволяет?
Автор: zQuatroz
Дата сообщения: 10.06.2010 19:00
Возник другой вопрос... Почему memmove() каждый раз получая одинаковые параметры выдает разные значения?...

если в кратце выглядит это так:

Цитата:

void clsCrypto::setup (u32 * k)
{
memmove (&key.d32[0], &k[0], keysizebytes);
....
}


Описание переменных выглядит так:

Цитата:

#define u32 unsigned long
#define u8 unsigned char
#define keysizebits 512
#define keysizebytes keysizebits / 8
#define keysize keysizebytes / 4

union
{
    u8 d8[keysizebytes];
    u32 d32[keysize];
}
key;

Библиотека написана на C.
Автор: karakurt2
Дата сообщения: 10.06.2010 20:22
я думаю, что в каждой единице компиляции свой экземпляр переменной key
Автор: zQuatroz
Дата сообщения: 10.06.2010 20:58
Каким образом? Если, в теории, он должен заполняться по 2-му и 3-му параметрам...
memmove (&key.d32[0], &k[0], keysizebytes)
А если они одинаковые, то и, опять же в теории, заполнение должно быть одинаковым..
А получение одного и того же результата при идентичных входных параметрах жизненно необходимо!

п.с. терзают смутные сомнения что memmove в данных условиях работает не так как надо..
Автор: karakurt2
Дата сообщения: 11.06.2010 04:19
если области памяти аргумента-источника и аргумента-приёмника перекрываются, перекрываются, функция memcpy() работает некорректно. функция memmove() избавлена от этого недостатка.

я предположил, что копирование происходит по разным адресам потому что memmove() возвращает адрес аргумента-приёмника. видимо, я Вас недопонял. было бы неплохо взглянуть на небольшой исходник, где иллюстрируется подозрительное поведение функции memmove().
Автор: zQuatroz
Дата сообщения: 11.06.2010 13:21
karakurt2, выложить проект пообрезав все лишнее или куски кода(как вызывается, объявляется и т.д.)?
Автор: karakurt2
Дата сообщения: 11.06.2010 15:44
нет, проект не нужен, лучше куски кода

а ещё лучше создать простенький драйвер для этих кусков, чтобы можно было бы протестировать у себя
Автор: zQuatroz
Дата сообщения: 12.06.2010 15:02
Вызов идет из основного тела программы, по нажатию на кнопку:


Цитата:

...
//до этого идет чтение из текст бокса и приведение типов к необходимому параметру
clsCrypto::setup(&ulKey);

Тип и класс описаны в .h файле, который привязан к cpp-шке в которой описаны функции...

Цитата:

//Кусок .h файла..
...
#define u32 unsigned long
...
class clsCrypto{
public:    
static void setup (u32 * k);
...
}

Функция в .cpp файле

Цитата:

void clsCrypto::setup (u32 * k)
{
    memmove (&key.d32[0], &k[0], keysizebytes);
...
}

Описание используемых переменных (частично в .cpp файле, частично в .h, тут все в куче):

Цитата:

#define u32 unsigned long
#define u8 unsigned char
#define keysizebits 512
#define keysizebytes keysizebits / 8
#define keysize keysizebytes / 4

union
{
u8 d8[keysizebytes];
u32 d32[keysize];
}
key;

п.с. если кусками, то вроде все..
Автор: ValidolX
Дата сообщения: 12.06.2010 15:38
#define u32 unsigned long
#define u8 unsigned char

вот ето лучше через typedef, господа
Автор: karakurt2
Дата сообщения: 12.06.2010 17:21
ValidolX
естественно

zQuatroz
я так понял, проблема в том, что функция memmove() копирует входные данные по разным адресам, правильно?

опишите нормально определения типов в заголовочном файле:


Код:
typedef unsigned long u32;
typedef unsigned char u8;

const int keysizebits = 512;
const int keysizebytes = keysizebits / 8;
const int keysize = keysizebytes / 4

typedef union
{
u8 d8[keysizebytes];
u32 d32[keysize];
}
key_union;

extern key_union key;

Автор: zQuatroz
Дата сообщения: 12.06.2010 23:49
правильность работы memmove была решена немного другим методом...
переходом на борландовский билдер...
Автор: ValidolX
Дата сообщения: 13.06.2010 00:03
zQuatroz

Ж))))) Ниф....а себе решение
жжете, товарисч
Автор: Vilian
Дата сообщения: 20.06.2010 21:10
Только начал делать первые шаги в программировании на C++ и уже есть вопросы. После компилирования наипростейшей программе я получаю ошибку следующего содержания:

Цитата:
fatal error C1083: Не удается открыть файл предкомпилированный заголовок: Debug\First_program.pch: No such file or directory

В чем тут проблема? Все наверно ответят, чтоб я снял галочку с "предварительного откомпилированного заголовка", но тогда зачем она там вообще нужна? Почему я получаю такую ошибку. Объясните мне. Строка #include "stdafx.h" в программе присутствует.

p.s. Установлена Visual Studio 2010.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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