как Объявить глобальный тип данных си

Forums:

Вообще , чтобы структура была видна как тип в рамках функции - просто объявите её в теле функции как-то так
но что если лезет ошибка типа =

D:\Bu-Bu\training programs\my\C\OS\t1\winfunc.c(10): error #2168: Operands of '=' have incompatible types '(incomplete) struct winparams' and '(incomplete) struct winparams'.

для кода вроде того =

#include <windows.h> // подключаем зоголовочный файл windows, содержащий в том числе описание winapi функций
#include "task1.h"
#include<stdio.h>
#include <stdlib.h>
/*обёртка дял функции int task1comp(FILE* fp,FILE* fp2,FILE* rfp)  
- в качестве параметра получает структуру с тремы указателями на файлы - 
зависит от функции  task1comp(FILE* fp,FILE* fp2,FILE* rfp)   */
DWORD WINAPI t1_win_comp( LPVOID lpParam ) 
{
  struct winparams strct= *((struct winparams*)lpParam); // ЗДЕСЬ ОШИБКА!!! приводим к типу нашей структуры , данные расположенные по адресу указателя 
   task1comp(strct.fp,strct.fp2,strct.rfp); // вызываем ключевыую функцию сравнения.
}

Как вы можете видеть - объявления структуры в данной функции нет (это объявление у меня находится в другом файле с исходным кодом task1.с , также подключённом у проекту) - объявление имеет такой вид =

		struct winparams { // структура для передачи параметров в объединённом виде для потока в windows
		 FILE *fp; // указатель на первый файл
		 FILE *fp2; // указатель на втоорй файл
		 FILE *rfp; // указатель на файл, для записи результата
	 }; 

для той же функции, код которой я привёл выше этого объявления в ином файле не достаточно (incomplete = "недостаточный") - то есть сведений о структуре для преобразования типов недостаточно.
Что же делать?

Давайте попробуем объявить "глобальный" тип данных структуры.

Логично предположить ,что такое объявление должно происходить за рамками "тела" какой-то конкретной функции проекта.

Итак , чтобы сделать тип "глобальным" для всей программы в си - надо поместить определение структуры в некоторм зоголовчном файле и просто включить этот файл во все остальные , где это определение используется.
Например , у меня есть файл winfunc.h в него помимо заголовка функции я добавлю и определение структуры =

#ifndef  WINFUNC_H // если включения ещё не было
#define  WINFUNC_H // определяем эту константу, чтобы избежать повторных включений.
DWORD WINAPI t1_win_comp ( LPVOID lpParam ) ; // функция-обёртка для создания нового потока. 
 struct winparams { // структура для передачи параметров в объединённом виде для потока в windows
		 FILE *fp; // указатель на первый файл
		 FILE *fp2; // указатель на втоорй файл
		 FILE *rfp; // указатель на файл, для записи результата
	 } ; 
	 
#endif

а помните - выше был пример самого winfunc.c - с си кодом - так вот в него я включу собственный заголовок =

#include <windows.h> // подключаем зоголовочный файл windows, содержащий в том числе описание winapi функций
#include "task1.h"
#include<stdio.h>
#include <stdlib.h>
#include "winfunc.h" // ДОБАВЛЯЕМ ЗАГОЛОВОК
/*обёртка дял функции int task1comp(FILE* fp,FILE* fp2,FILE* rfp)  
- в качестве параметра получает структуру с тремы указателями на файлы - 
зависит от функции  task1comp(FILE* fp,FILE* fp2,FILE* rfp)   */
DWORD WINAPI t1_win_comp( LPVOID lpParam ) 
{
   
    struct winparams strct= *((struct winparams*)lpParam); // приводим к типу нашей структуры , данные расположенные по адресу указателя 
   task1comp(strct.fp,strct.fp2,strct.rfp); // вызываем ключевыую функцию сравнения.
}

И ВСЁ РАБОТАЕТ!

_____________________________________________
Источники(читать подробнее)=
http://www.daniweb.com/software-developm...
Ключевые слова и фразы(для поиска)=
объявить структуру так она чтобы была видна всему модулю
объявление структуры си
how to make struct type global c
http://www.daniweb.com/software-developm...
vedro-compota's picture

hi Billy !! )) WE'RE IN WINDOWS NOW !))
----------------
[build as win32 CONSOLE program]
----------------

Please specify the number of the task.
* You can choose on number from set = {1,2}
* Specify "0" to exit
* Choose "t" to test
е

Error(!) = Main menu does not support this command.
Make sure that your task number is from menu set of commands and try again.

Please specify the number of the task.
* You can choose on number from set = {1,2}
* Specify "0" to exit
* Choose "t" to test
t

[...open file for me now...]
[file is open]
12fdg dfb
arthsfgnhjk
bfg

123456789+0
9

[...open file for me now...]
[file is open]

[...open file for me now...]
[file is open]

[...open file for me now...]
[file is open]

[...open file for me now...]
[file is open]
[...text file conversion is started...]

[...number of lines had been found out = 8 ]

[...the quantity of symbols in file in each line had been found out...]
[...text file conversion is started...]

[...number of lines had been found out = 8 ]

[...the quantity of symbols in file in each line had been found out...]

[...two-demision array showing is started...]
12fdg dfb
[i = 0][k = 1]arthsfgnhjk
[i = 0][k = 2]bfg
[i = 0][k = 3]
[i = 0][k = 4]
[i = 0][k = 5]123456789+0
[i = 0][k = 6]9
[i = 0][k = 7]

[...two-demision array showing is started...]
1345642575adfhgs sth sth
[i = 0][k = 1]arthsfgnhjk
[i = 0][k = 2]styj dukeyuks
[i = 0][k = 3]arthty jkyukkkyukdu
[i = 0][k = 4]sthtykj8lkldyu
[i = 0][k = 5]
[i = 0][k = 6]00000000000000000000
[i = 0][k = 7]

[...comparation of two two-demision arrays showing is started...]
===========
(0) (-) | [12fdg dfb] | [1345642575adfhgs sth sth]
---------------------
(1) (+) | [arthsfgnhjk ] | [arthsfgnhjk ]
---------------------
(2) (-) | [bfg] | [styj dukeyuks]
---------------------
(3) (-) | [] | [arthty jkyukkkyukdu]
---------------------
(4) (-) | [] | [sthtykj8lkldyu]
---------------------
(5) (-) | [123456789+0] | []
---------------------
(6) (-) | [9] | [00000000000000000000]
---------------------
(7) (-) | [__________] | [__________]

---------------------
-----------

Please specify the number of the task.
* You can choose on number from set = {1,2}
* Specify "0" to exit
* Choose "t" to test
1

This is task1 menu=

* Specify "1" to use standard files for compare operations
* Choose "2" to specify your own files for comparing
* Specify "9" to come back in main menu
* Specify "0" to exit
1

[...open file for me now...]
[file is open]

[...open file for me now...]
[file is open]

[...open file for me now...]
[file is open]

Please specify the number of the task.
* You can choose on number from set = {1,2}
* Specify "0" to exit
* Choose "t" to test
*** Process returned -1073741819 ***
Press any key to continue...

_____________
матфак вгу и остальная классика =)