산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial Internet of Things >> 임베디드

내장 펌웨어 팁:신호 파형 및 기타 파일 데이터를 사용하여 C에서 배열을 초기화하는 방법

이 문서에서는 텍스트 파일의 값을 사용하여 C 프로그램에서 배열을 초기화하는 방법을 보여줍니다.

이 기사에서는 텍스트 파일의 값을 사용하여 C 프로그램에서 배열을 초기화하는 방법을 보여줍니다. 데이터는 소스 파일에 저장되지 않습니다. 프로그램이 컴파일될 때 파일을 읽습니다. 1차원 및 다차원 배열이 고려됩니다. 예제는 또한 어레이를 RAM 또는 비휘발성 메모리에 배치하고 초기화에 사용할 데이터 파일을 선택하는 방법을 보여줍니다.

예제에 사용된 컴파일러는 32비트 마이크로컨트롤러를 대상으로 하는 ARM용 GCC입니다. 모든 예제는 표준 C를 사용하고 이 컴파일러로 작업했습니다.

배열 초기화의 기본

배열은 "선언"될 때 값으로 초기화될 수 있습니다. 일반적인 선언이 여기에 표시됩니다. 중괄호 안의 값을 "이니셜라이저"라고 합니다.


대괄호 안에 배열의 크기를 지정하지 않으면 크기는 이니셜라이저의 개수가 됩니다. 배열의 크기보다 이니셜라이저가 적은 경우 추가 요소는 0으로 설정됩니다. 배열의 크기보다 이니셜라이저가 많은 것은 오류입니다.

공백

이니셜라이저는 쉼표로 구분해야 합니다. "공백"을 추가해도 됩니다. 이 경우 공백은 "공백" 또는 공백입니다. 공백 문자 집합에는 공백(또는 공백), 탭, 줄 바꿈, 캐리지 리턴, 세로 탭 및 양식 피드가 포함됩니다. 개행 및 캐리지 리턴은 C 소스 코드에서 행의 끝을 나타내는 데 사용됩니다. 양식 피드는 알지만 세로 탭은?

일반적으로 C는 명령문이 공백을 포함하거나 다른 행에서 계속되는지 여부를 신경 쓰지 않습니다. 여기의 진술은 위의 진술과 동일합니다. 큰 배열에 대한 많은 이니셜라이저 라인을 보는 것이 일반적입니다. 어쩌면 심지어 페이지. 어느 시점에서 우리는 "더 나은 방법이 있습니까?"라고 말할 수 있습니다.


파일에서 배열 초기화

C 소스 코드는 컴파일 전에 전처리기를 통해 실행됩니다. C 전처리기의 일반적으로 사용되는 기능은 "파일 포함"입니다. 다음은 Kernighan과 Ritchie의 유명한 책 "C 프로그래밍 언어"의 인용문입니다.

"파일을 포함하면 #define 컬렉션을 쉽게 처리할 수 있습니다. 및 선언(무엇보다도 ).”

나는 "무엇보다도"에 대해 이탤릭체를 추가했습니다. 우리는 일반적으로 ".c" 및 ".h" 파일을 포함하지만 전처리기는 파일의 이름 확장자를 신경 쓰지 않습니다. 모든 텍스트 파일은 OK입니다. 따라서 다음 구문은 배열을 초기화하는 데 작동합니다.


파일에는 문서 서식을 지정하기 위해 숨겨지는 특수 문자가 포함되어서는 안 됩니다. 간단하게 유지하세요. 서식 있는 텍스트 형식이 없습니다. 열 헤더가 없습니다. 숫자, 쉼표 및 공백만 사용할 수 있습니다. 다음은 Windows 메모장으로 만든 파일입니다.


다음은 디버거로 표시된 메모리의 배열입니다. 이 경우 배열은 위치 열의 상위 주소로 표시된 RAM에 있습니다.


비휘발성 메모리에 어레이 저장 및 데이터 파일 선택

위의 예에서 배열은 전역 변수이며 배열을 넣을 위치를 지정하지 않습니다. 컴파일러와 링커는 배열이 프로그램에 의해 수정될 수 있고 RAM에 배치될 수 있다고 가정합니다. 초기 값은 비휘발성 메모리("NVM", 일반적으로 플래시 메모리)에 있으며 RAM의 배열은 주 프로그램 이전에 실행되는 코드에 의해 이 데이터에서 초기화됩니다. NVM의 이 데이터는 프로그램에서 액세스할 수 없습니다. 어레이가 수정되지 않을 경우("상수") NVM에만 저장되고 프로그램에서 직접 액세스합니다. 이것은 종종 공급이 부족한 RAM을 절약합니다. 컴파일러와 링커에 배열이 변경되지 않을 것이며 NVM에서 배열을 찾는 것은 일반적으로 "const "예선. 다음은 예와 결과입니다. 위치 열은 이 마이크로컨트롤러의 플래시 메모리인 메모리 맵에서 낮은 값을 보여줍니다.


#define 그리고 #if 전처리 문은 배열을 찾고 초기화에 사용할 데이터 파일을 선택하는 옵션을 제공하는 데 사용할 수 있습니다. 다음은 RAM 또는 NVM에서 어레이를 찾는 옵션을 제공하는 예입니다.


#if 구성은 "조건부 포함"의 예입니다. 이 경우 "const ” 한정자는 배열을 선언할 때 사용됩니다. 선언이 둘 이상의 행에 있을 수 있기 때문에 작동합니다. 달리 말하면 공백은 괜찮습니다.

다음은 초기화할 파일을 선택하기 위해 조건부 포함을 사용하는 예입니다.


대형 어레이로 테스트

노이즈 파형을 나타내는 임의 데이터의 큰 파일이 있고 NVM에서 큰 배열의 초기화를 테스트하는 데 사용했습니다. 다음은 데이터 및 선언의 플롯입니다.



다음은 파일의 시작 부분입니다.


원본 csv 파일에는 값 뒤에 쉼표가 없습니다. 이는 찾기/바꾸기 작업에서 표현식을 사용할 수 있는 편집기를 사용하여 쉽게 추가되었습니다. 이 경우 줄 구분 기호 "\R"에 대한 표현식을 사용했습니다. 찾기는 "\R"이고 바꾸기는 ",\R"입니다. 한 번의 찾기/바꾸기 작업으로 10,000개의 값에 대한 모든 쉼표가 추가되었습니다.

모든 것이 훌륭하게 작동하고 매우 빠르게 컴파일되었습니다! 다음은 메모리에 있는 배열의 시작 부분입니다. 디버거는 디스플레이를 각각 100개 요소의 그룹으로 멋지게 나눴습니다.


다차원 배열

데이터가 두 개 이상의 차원으로 구성되어 있으면 어떻게 될까요? uint16_t test[2][3]로 선언된 2차원 배열을 살펴보겠습니다. . C에서 오른쪽 아래 첨자(3)는 메모리에서 연속적인 요소가 있는 1차원 배열입니다. 왼쪽 아래 첨자(2)는 이러한 3요소 배열 중 2개가 있음을 의미합니다. 다음은 6개 요소의 메모리 배열입니다.

[0,0] [0,1] [0,2] [1,0] [1,1] [1,2]

오른쪽 첨자를 증가시켜 메모리의 연속적인 요소에 액세스하는 것이 메모리를 통한 "홉"이 필요한 왼쪽 첨자를 증가시켜 요소에 액세스하는 것보다 빠르기 때문에 메모리의 순서가 중요합니다. 어레이에 1,000개 요소로 구성된 두 개의 벡터가 있는 경우 조직은 test[2][1000]이어야 합니다. 가장 빠른 액세스를 위해.

다음은 2차원 배열을 초기화하는 예입니다. 이니셜라이저는 오른쪽 아래 첨자의 1차원 배열에 대한 이니셜라이저를 그룹화하는 추가 중괄호로 그룹화됩니다.


이 형식은 숫자, 쉼표 및 공백만 가질 수 있는 데이터 파일에 문제를 만듭니다. 추가 중괄호를 생략하면 어떻게 됩니까?


컴파일러는 오른쪽 첨자를 먼저 채우는 초기화 프로그램을 통해 왼쪽에서 오른쪽으로 이동하여 배열을 채웁니다. 내가 사용하고 있는 컴파일러는 다음과 같은 경고를 표시합니다. “이니셜라이저 주위에 중괄호가 누락됨 ". 이니셜라이저의 수가 배열의 요소 수와 정확히 같으면 문제가 없습니다. 그러나 동일하지 않은 경우 안내 역할을 하는 중괄호가 없는 경우 배열을 채우는 방법이 명확하지 않습니다.

배열은 여러 #include를 사용하여 여러 파일에서 채울 수 있습니다. 진술. 다음은 초기화가 중괄호 쌍으로 완전히 괄호로 묶인 예입니다. 이전 예에 표시된 세부정보는 생략합니다.


합집합에서 배열 초기화

공용체는 동일한 메모리를 공유하는 서로 다른 유형의 객체를 보유할 수 있는 변수이며 컴파일러는 객체가 다른 것처럼 추적합니다. 이 배열은 메모리가 부족한 임베디드 애플리케이션에 유용할 수 있습니다. 다음은 벡터[6]의 예입니다. 하나의 차원과 매트릭스[2][3] 포함 2차원으로. 메모리에서 동일한 위치를 차지하는 두 개의 배열입니다.


공용체 초기화 규칙은 공용체의 첫 번째 규칙입니다(vector[6] ) 이니셜라이저로 채워집니다. 배열의 순서가 반대로 된 경우 초기화 프로그램이 중괄호로 완전히 묶이지 않았기 때문에 컴파일러에서 경고를 표시합니다. #include 주위의 중괄호를 확인하세요. 두 배가 됩니다. 외부 집합은 공용체에 대한 모든 이니셜라이저를 포함하고 내부 집합은 배열 유형에 대한 것입니다.

여기 파일이 있습니다. 나는 두 줄을 가지고 있지만 그것은 중요하지 않습니다. 여백이 더 많습니다.


다음은 메모리의 배열입니다. vector[ ]의 시작 위치를 확인하세요. 및 매트릭스[ ][ ] 동일합니다.


숫자, 쉼표 및 공백만 있는 단일 파일에서 다차원 배열을 초기화하는 다른 방법이 있습니까? 댓글을 추가하여 알려주세요.

보너스 팁:문자열

문자열은 어떻습니까? 다음은 문자열을 초기화하는 예입니다.


#include 따옴표 안에는 작동하지 않습니다. C 구문을 알고 있는 내 편집자는 나에게 많은 물음표와 구불구불한 밑줄을 제공합니다. 새 줄의 문자 및 #include 자체가 이니셜라이저입니다! 가난한 편집자는 혼란스러워합니다. 이 엉망진창은 컴파일되지만 문자열은 파일이 아닌 여기에서 볼 수 있는 문자로 채워집니다.


해결책은 파일에 따옴표를 넣는 것입니다.


그런 다음 다음과 같은 문장을 사용하세요.


파일 이름 주위의 따옴표는 #include 구문을 사용하고 이니셜라이저를 제어하지 않습니다. 다음은 RAM의 결과입니다.

<시간 />

모든 예제가 이론적으로 작동해야 한다는 점에 유의하는 것이 중요합니다. 모든 컴파일러와 함께. 그러나 일부 예제는 흔하지 않을 수 있으며 일부 컴파일러에서 문제를 일으킬 수 있습니다. 문제를 발견하면 댓글로 알려주세요.


임베디드

  1. 클라우드와 클라우드가 IT 세계를 변화시키는 방식
  2. ST는 STM32 신경망 개발자 도구 상자를 사용하여 에지 및 노드 임베디드 장치로 AI를 구동합니다.
  3. DATA MODUL:고휘도 및 easyTouch 기능을 갖춘 대형 오픈 프레임 모니터
  4. Microchip:최대 153.6kSPS의 데이터 속도를 지원하는 24비트 및 16비트 ADC
  5. Contrinex:Bluetooth 인터페이스가 있는 클라우드 지원 스마트 센서 및 안전 라이트 커튼
  6. C++의 배열 | 선언 | 초기화 | 배열 예제에 대한 포인터
  7. 예제를 사용한 C++ 배열 동적 할당
  8. Java BufferedReader:예제를 사용하여 Java에서 파일을 읽는 방법
  9. Tech Data 및 IBM Part 2로 IOT를 실현하는 방법
  10. Tech Data 및 IBM Part 1을 통해 IoT를 현실로 만드는 방법