반응형

정말 한참을 고민하고 찾아보았다.

2차원 배열을 선언하고 사용하다가 갑자기 1차원 배열을 인자로 주어야 하는 상황이 발생한 것이다.

 

반복문으로 하기는 싫고, 틀림 없이 제공해 주는 기능이 있을 것이라 생각 했다.

 

그러다가 stack overflow 에서 답을 찾았다.

 

검색 :" c# convert 2d array to 1d"

참조 : https://stackoverflow.com/questions/797354/how-to-copy-a-row-of-values-from-a-2d-array-into-a-1d-array

 

매우 간단하게 해결한 것을 보았다..

이전에 찾은것은 전부 Array.copy() 를 사용했었는데 이것은 같은 차수여야만 가능했다.

 

이번에 찾은 것을 정리해 보자

 

int[,] oGridCells = {{1, 2}, {3, 4}};
int[] oResult = new int[4];
System.Buffer.BlockCopy(oGridCells, 0, oResult, 0, 16);

 

이런식으로 하면 원하는 배열을 추출할 수 있다.

다만 마지막 인자가 byte 단위 이므로 각자 원하는 데이터형의 크기만큼 곱해주어야 한다.

sizeof(int), sizeof(double) 등을 사용해서 곱해주면 간단하다...

 

반응형
반응형

이건 그냥 개인 취미 생활을 위해 한번 만들어 보았다.

매우 단순하게 어떤 프로세스에 스페이스바 키가 주기적으로 입력되게 하는 걸 만들려고 했는데

생각보다 시간이 오래 걸렸다.


코드는 매우 간단하다.


디자인도 매우 단순한게 했는데

설명을 하자면 

1. 'Search' 버튼을 클릭하면 모든 프로세스의 타이틀을 불러와서 listbox에 추가한다.

2. 내가 원하는 프로세스의 타이틀을 listbox에서 선택 후 'start' 버튼을 누른다.

2. FindWindow 함수를 사용해서 내가 원하는 타이틀을 가진 프로세스의 핸들을 가져온다.

3. SendMessage 함수가 WM_KEYDOWN 이벤트를 발생시킨다.



매우간단하다. 응용하면 여러가지 가능하겠죠 ? 

반응형
반응형

C++ 64bit Dll 을 만들어서 C# 에서 사용하고 있었다...

그런데... 문제가 발생했다. 사용해야 할 PC가 Stick PC 로 바뀌면서 32bit로 변환해주어야 하는 상황이 발생한 것..


dll을 32bit로 컴파일해서 넣으면 끝나는 줄 알았다.

그렇게 쉬운게 아니었다. 에러는 계속 나고.. 해결은 안되고..


다른 에러들은 쉽게 해결했지만 마지막 에러가 오래 걸렸다.


추가 정보: PInvoke 함수 'H-Stage_Demo!H_Stage_Demo.MainForm::SetMagnification'에 대한 호출 결과 스택이 불안정하게 되었습니다. 관리되는 PInvoke 시그니처와 관리되지 않는 대상 시그니처가 일치하지 않기 때문인 것 같습니다. 호출 규칙 및 PInvoke 시그니처의 매개 변수와 관리되지 않는 대상 시그니처가 일치하는지 확인하십시오.


이런 에러인데.. Invoke라 길래 동기화인줄 알고 동기화 처리 하다가 에러를 그대로 구글에 입력하니까 해결방법이 나왔다.


출처 : http://freyya.tistory.com/131


설명이 잘되어 있는 곳이 있었지만.. 도통 무슨말인지 모르겠고 시간도 없기에 그냥 해결방법만 간단히 나온 출처를 남긴다.


이전에 정리 했듯이 C#에서 DLL 함수를 사용하기 위해서는 DllImport 를 해야 하는데


[DllImport("DLL파일명")]

함수();


이런 식이으로 하면 되었지만 위의 에러가 발생할 경우에는 호출방법을 정의해 주어야 한다.


해결


[DllImport("DLL파일명", CallingConvention = CallingConvention.Cdecl))]

함수();





간단한가... 그래도 왜 저렇게 써야하는지는 나도 이해가 안되므로 나중에 기회가 된다면 정리하자.

반응형
반응형

모터가 멈췄는지 확인하는 함수가 있는데 이게 순식간에 지나가니까 진행되는지 확인이 안되더군..

그래서 C# 하기 전에 비프음을 썻던게 생각이 나서 적용해 보기로 햇지..


출처 : https://msdn.microsoft.com/ko-kr/library/system.media.systemsounds.beep(v=vs.110).aspx


사용법은 간단 간단하다.

namesapce = System.Media

'using System.Media'를 추가해 주면 된다.


함수는

SystemSounds.Beep.Play();

간단하죠 ? 주의할점은 SystemSound(s)로 쓰면 안됩니다. 's'를 꼭 체크해주십시오..


소리는 바꿀 수 있나 모르겠네

반응형
반응형

모터 구동 드라이버 연결을 해서 동작시키는 프로그램을 짜게 되었다.

갑자기 짜던 사람이 퇴사하는 바람에...


차근차근 해봅시다.


우선 시리얼 포트로 연결되어 있기에 콤보박스에 시리얼 포트를 검색해서

리스트를 추가하는 것을 알아봅시다.


출처 : http://leekd123.tistory.com/48


우선 Ports 추가.


검색하고 콤보박스에 추가하는 코드


GetPortNames 로 연결된 시리얼 포트를 검색.

cbPortNames 가 콤보박스이고 아이템들을 클리어 후 foreach로 추가해주는 것!


적용은 어떻게 했느냐 하면


포트를 검색해서 리스트에 추가해주는 함수를 만들고

그거를 5초마다 실행하는 타이머를 생성.

폼 로드될 때 리스트 추가를 한번 해주고 타이머를 실행.

이렇게 되면 5초마다 리스트가 리셋되는 거죠...



반응형
반응형

배열을 선언하면서 0또는 같은 수로 초기화 하고 싶다.

그러나 생성자에는 없는듯 하여 알아보았다.

한글로 검색하면 나오질 않더이다.


구글 검색 : Array Zero Initialize 

참고 : http://stackoverflow.com/questions/14210369/initialize-an-integer-array-with-a-single-value-in-c-sharp-net


정말 단 한줄로 가능.

double[] array= Enumerable.Repeat<double>(0, length).ToArray<double>();


한줄로 끝난다. 굿 ?


자료형만 맞춰주면 되고 '0'에 초기화 하고 싶은 숫자를 넣어 주면 된다.

length 는 할당하고 싶은 크기를 넣어 주면 된다.


반응형
반응형

아학학학학학학.. 매우 간단하게 DataTable을 CSV 파일로 저장하는 방법을 찾아냈다.


포지션 위치랑 각도 등을 테이블로 만든 후 csv 파일로 저장해야 되서 해보았다.

반복도 매우 심플하게 해놓았다. 가져다 쓰시게.. 난 까먹을거 같아서 정리를..


1. 파일 저장 위치 지정

2. dataTable columns를 String.Join()을 사용해서 파일에 저장.

3. 각 row를 String.Join()을 사용해서 파일에 저장.

4. 저장 확인.



우선 코드


1. 파일 저장 위치 지정

   - SaveFileDialog로 저장 위치 선택

   - Stream 생성


2. 컬럼 이름 저장.

  - String.Join(",", DataTableName.Columns.Cast<object>());

    ","을 각 객체를 나누어서 String을 리턴해 준다. 매우 편하게 컬럼을 나눌 수 있다.


3. 각 로우 저장.

  foreach 를 사용해서 갯수를 구하지 않고 바로 반복문을 진행.

  DataRow.ItemArray.Cast<object>() 를 컬럼처럼 ","로 나누어 주었다.


4. 저장 확인 

 잘 되었나 봅시다.


매우 심플하게 CSV 파일로 저장을 해보았습니다. 끝 !


반응형
반응형

출처 : http://blog.danggun.net/16


위의 출처대로 하면 일단은 잘 됩니다.


단 제가 무시하고 했던것이  1-0.인크루드  이 부분이었는데

꼭!!!!!!!!! #include<windows.h> 이거를 헤더에서 추가를 해주어야 합니다!!!! 꼮 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


tip1. 전달할 인자가 포인터 이면 ref를 사용해서 넘기면 됩니다.

예를 들어 

  void swap(int *a, int *b) 로 c++에서 선언했다면

C#에서는

  void swap(ref int a, ref int b) 이렇게 해주면 됩니다.



tip2. c++ 컴파일 환경과 C# 컴파일 환경이 맞아야 합니다.

 C#의 경우 anyCpu 라고 나오는데 이거스로 하면 c++ x86 DLL을 사용해야 되고

 any cpu 말고 x64로 바꿔줄 경우 c++x64와 같이 사용하면 됩니다.




반응형
반응형

OpenFileDialog로 파일 경로를 구해온 뒤

FileName에서 파일 이름만 구해오고 싶다.

어떤 사람은 "\\"위치에서 그다음 인덱스를 이용해서 구해오는 사람도 있었으나..


매우 간단하게 구해주는 함수가 있어서 정리할 겸 공유 할겸 정리를 해본다.


우선 경로에서 파일 이름과 확장자 를 가져오는 방법은

Path.GetFileName(openFileDialog1.FileName);


위의 방법으로 하면 파일명과 확장자를 전부 가져 온다.


사실 내가 필요한건 확장자를 빼고 파일명만 가져오고 싶었다.


확인결과 역시나 함수가 있었다.


Path.GetFileNameWithoutExtension(openFileDialog1.FileName);


위의 방법을 사용하면 확장자를 뺀 파일명만 리턴해준다.


매우 간단 ㅇㅈ?


힘들게 역슬러쉬(\) 위치 구해서 파일 이름 알아오지말고 이미 만들어진 함수를 사용하자.

반응형
반응형

CSV 파일을 만들어야 한다.

내가 원하는 기능은 

1. 한줄씩 파일에 입력하는 것.

2. listbox에 있는 데이터를 csv에 입력하는 것.

3. chart에 있는 y축 값을 차례대로 csv에 입력하는 것.


우선 코드를 다 붙여놓고 설명을 해보자.





우선 SaveFileDialog로 파일 저장 위치및 이름 지정.


그다음부터 내가 원하는 기능 설명.


1. 한줄씩 파일에 입력.

파일 저장경로를 지정했으면 FileStream을 Append모드로 생성한다.

StreamWriter 를 filestream을 지정하여 생성한다.


함수가 끝날 쯔음에 StreamWriter 부터 Close해주고, FileStream을 Close 해준다.

 - 생성과 반대로 해제.


2. listBox에 있는 데이터를 csv 에 입력.

이건 생각보다 매우 간단한다.

string.Join 함수를 사용하면 한방에 끝난다.

string.Join( 나눌 문자, 리스트박스 items)


간단하다

listbox items를 그냥 넣으면 리스트 박스 설명만 한줄 나온다.

여기서 Cast<object>() 함수를 써주면 각 아이템들을 리스트화해주기때문에

각 아이템을 ","로 나눈 문자열을 만들어 준다.

만들어주고나서 StreamWriter를 사용해서 파일에 써주면 끝.


3. chart에 있는 y축 값을 차례대로 csv에 입력하는 것.

이건.. 조금 고민을 해봤는데 한방에는 어렵고 List<double>로 바꾸어 준 다음에 넣으면 된다.

반복문을이용해서 list에 넣어준다음 리스트박스 적용한 것처럼 string.join()을 사용해서 각 항목을 ","로 나누어 주면 된다.


결과




반응형

+ Recent posts