박력돌이

wooristar.egloos.com

포토로그



[C#] 조사식에 지역 변수를 추가하고 싶을 때 C,C++

프로젝트를 MDI폼 이나 다중 폼 형태로 개발할 때 조사식 창에 내가 현재 보고 있는 폼의 변수 등을 넣어 조사하고 싶은데
입력이 안될 경우가 종종 있다.

변수를 조사식창에 그냥 집어 넣으면 "'변수명' 이름이 현재 컨텍스트에 없습니다." 라는 에러 메세지가 뜬다.

이 경우 조사식의 이름에 구체적으로 입력해줘야 한다.

Program.cs에 보면

Main() 함수가 Application. Run(new 메인폼이름()); 형태로 시작하므로

조사식에 넣을 이름도 Application에서 부터 그 기원을 쫓아가야 한다.

아래는 실제 프로젝트 명에서 발췌하여 찾아간 특정 변수 명이다.
((prj_BAscope_WaveformView.frmWaveformView)((((System.Collections.ReadOnlyCollectionBase)(System.Windows.Forms.Application.forms)).list)._items[1])).tBar1refValue



[C#] 차트요소가 이미 seriesCollection에 존재한다는 예외 메세지가 발생할 때 C,C++

C#에서 차트를 사용할 때 가끔 차트요소가 이미 seriesCollection에 존재한다는 예외 메세지가 발생할 때가 있는데
그때 아래와 같이 IsUniqueName 메소드를 사용하여 조건을 걸어주면 해당 메세지가 안 뜬다.

출처: http://stackoverflow.com/questions/16412867/a-chart-element-with-the-name-already-exists-in-the-chartareacollection


    private void createNewSeries(String SeriesName)
    {
        if(chart1.Series.IsUniqueName(SeriesName))
        {
            chart1.Series.Add(SeriesName);
        }
    }

내 소스
            //Series object adding to Chart.
            if (ChartCurVolt.Series.IsUniqueName("전류(A)"))
            {
                ChartCurVolt.Series.Add(SeriesCurrent);
            }
            if (ChartCurVolt.Series.IsUniqueName("전압(V)"))
            {
                ChartCurVolt.Series.Add(SeriesVolt);
            }



유치원 앞 놀이터



Evaluation Stack 이란??

닷넷의 C#으로 짠 콘솔용 프로그램 예제를 IL DASM (디스어셈블러의 일종, VS에서 기본 제공)로

열어서 main() 함수를 보면 MSIL 기반의 OP CODE의 리스트가 나오는데 이 OP CODE를
이해하기 위해 필연적으로 알아

Evaluation Stack

The evaluation stack, which is mentioned often in the description of the Hello World application, is the pivotal structure of MSIL applications. It is the bridge between your application and memory locations. It is similar to the conventional stack frame, but there are salient differences. The evaluation stack is the viewer of the application, and you can use it to view function parameters, local variables, temporary objects, and much more. Traditionally, function parameters and local variables are placed on the stack. In .NET, this information is stored in separate repositories, in which memory is reserved for function parameters and local variables. You cannot access these repositories directly. Accessing parameters or local variables requires moving the data from memory to slots on the evaluation stack using a load command. Conversely, you update a local variable or parameter with content on the evaluation stack using a store command. Slots on the evaluation stack are either 4 or 8 bytes.

이벨류에이션 스택은 헬로월드 앱의 설명에 종종 언급되는 것으로 MSIL 앱의 피벗 형태 구조이다.

이는 당신의 앱과 메모리 로케이션 사이를 연결하는 다리 역할을 한다.

또한, 컨벤셔널 스텍 프레임과 유사하지만 상당히 다른 점도 존재한다.

이벨류에이션 스택은 앱의 뷰어이다. 그리고 펑션 파라메터, 지역 변수, 임시 오브젝트, 그 외 많은 것들을 보기 위해 사용할 수 있다.

전통적으로 펑션 파라메터와 지역 변수는 스택에 위치한다. 닷넷에서 이 정보는 각각의 저장소에 저장된다.

해당 정보들이 저장된 메모리는 펑션 파라메터와 지역 변수들을 위해 예약되어 있다.

따라서, 이 메모리에 직접적으로 접속하는 것은 불가능하다.

파라메터와 지역변수에 접속하는 것은 load 명령을 사용하는 이벨류에이션 스텍위의 메모리에서 슬롯으로 데이터를 이용하는 것이 요구된다. 

거꾸로 말하자면, store 명령을 사용하는 이벨류에이션 스텍의 컨텐츠와 함께 지역 변수와 파라메터를 업데이트 해야한다.

이벨류에이션의 슬롯은 각각 4 또는 8 바이트이다.


Figure 11-1 shows the relationship between the evaluation stack and the repositories for function parameters and local variables.

그림 11-1은 펑션 파라메터와 지역변수용 이벨류에이션 스텍과 저장소 간의 관계를 보여준다.

Image from book 
Figure 11-1: A depiction of the evaluation stack, function parameters, and local variables

The evaluation stack is a stack and thereby a last in/first out (LIFO) instrument. When a function starts, the evaluation stack is empty. As the function runs, items are pushed and popped from the evaluation stack. Before the function exits, except for a return value, the evaluation stack must once again be empty. The jmp and tail instructions are exceptions to this rule. If the evaluation stack is not empty at exit, the run time raises anInvalidProgramException exception.


The .maxstack directive limits the number of items permitted simultaneously on the stack. The directive is optional. If the directive is not present, eight slots are reserved on the evaluation stack. The .maxstack directive is a confirmation that an application is performing as expected. Extra items on the evaluation stack are an indication of potential logic problems in an application or a security violation. In either circumstance, this is a violation worthy of a notification.


출처: http://etutorials.org/Programming/programming+microsoft+visual+c+sharp+2005/Part+IV+Debugging/Chapter+11+MSIL+Programming/Evaluation+Stack/

번역: 직접 번역 (일부 직역으로 의미 전달이 비효율적일 수 있으니 한글 번역은 참고만 하세요.)


Introduce Vector KnowledgeBase Vector(CANoe)

I'm pleased to introduce Vector KnowledgeBase(https://vector.com/kbp/).

There are a lot of Q&A about Vector's products especially CANoe & CANalyzer.

If you have a question when you use vector's S/W such as CAPL, COM, CANoe, CANalyzer, it would be a good resource of an answer.


20141210 체코출장 단상

The price of tremre? has recently incresed to 60 kc.
Prepaid sim card Price is 200kc for 500mb with only data.
by using cd online website, I got a ticket to prague easily, but the problem was HMMC IT dept. has blocked to access to KB card server for paying in south korea but Hyundai card was ok.

I stayed hansol guesthouse for 10days. But the only thing I like was big room the others were sucks.
A meal was bad. Especially in the morning breakfast was pretty much same everyday and in dinner they served with same dishes as morning.

In Prague main station, I used to use coin locker 2 years ago. But now there is a booth to let the luggage take temporarily.
a luggage which sizes over 1m is needed to pay for 100kc or 2.5eur.
below 1m, price is 60kc.

In prague international airport, there is vodafone booth. But the employee was rude, price is more expensive than t-mobile's.




[.NET] Microsoft.Jet.OLEDB.4.0′ 공급자는 로컬 컴퓨터에 등록할 수 없습니다. VB

Microsoft.Jet.OLEDB.4.0′ 공급자는 로컬 컴퓨터에 등록할 수 없습니다.
The ‘Microsoft.Jet.OLEDB.4.0′ provider is not registered on the local machine.


위 문제는 JET가 64bit OS를 지원하지 않아서 생기는 문제로
VS의 구성 관리자에서 빌드 정보를 x86으로 설정해주면 된다

문제는....!!!!!!!!!!!
x86으로 빌드정보를 변경하고 실행하면 잘되는데
사용자 컨트롤 테스트 컨테이너에 내가 만든 유저 컨트롤이 표시가 안된다.
혹시나 해서 x86에서 any CPU로 바꾸면 다시 컨테이너에 표시가 되는데 이러면 또 JET와 연결이 안된다.


[.net] OleDb를 연결하는 방법 VB

MSDN의 예제를 일부 차용하였고 내가 이해 못했던 부분에 주석을 강화하여 작성하였다.

그에 맞는 예제 및 MDB 파일도 첨부 하였다.

MSDN 주소: http://msdn.microsoft.com/library/dw70f090.aspx

아래 코드를 이용해서 프로그램을 짤 때는

반드시 콘솔 프로그래밍을 선택해야 한다.

Console.Writeline은 콘솔 프로그래밍에서만 적용됨



Option Explicit On
Option Strict On

Imports System
Imports System.Data
Imports System.Data.OleDb 'OleDb를 Imports하지않으면 OleDb관련 컴파일 에러 발생한다. 반드시 Imports해야함

Module Module1

    Sub Main()
        Program.Main()
    End Sub

End Module

Public Class Program
    Public Shared Sub Main()

        ' The connection string assumes that the Access
        ' Northwind.mdb is located in the c:\Data folder.
'----connectionString의 정의가 중요함. 틀리지 않아야 하며 파일경로나 파일명이 틀리는 경우가 잦으니 주의----
'----ID는 admin이 기본이고 Password는 없음으로 설정, Password를 걸면 연결할때 오류 발생하기 쉬움-------

        Dim connectionString As String = _
             "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
            & "c:\data\Northwind.MDB;User Id=admin;Password=;"

        ' Provide the query string with a parameter placeholder.
'----쿼리문을 만들때 아래 내용 설명을 좀 하겠음.
'----일단 MDB파일은 Northwind.MDB파일이고 그 파일의 ProductName 테이블의 ProductID, UnitPrice, ProductName을 선택
'----거기서 UnitPrice가 ? 보다 큰 값들만 선택한다.(여기선 ? 이므로 모두 선택);Where는 조건을 의미
'----ORDER(정렬)는 UnitPrice순으로 하되 내림차순(DESC : Descent)으로 정렬한다. 라는 의미이다.

        Dim queryString As String = _
            "SELECT ProductID, UnitPrice, ProductName from Products " _
            & "WHERE UnitPrice > ? " _
            & "ORDER BY UnitPrice DESC;"

        ' Specify the parameter value.
'----파라메터를 왜 정의하는지 잘 모르겠다. 암튼 파라메터의 의미는 아래와 같다.
'----AddWithValue : 값을 OleDbParameterCollection 끝에 추가합니다. 
'----실제 DB만 조회할 때는 이부분을 없애도 큰 이상은 없었음

        Dim paramValue As Integer = 5

        ' Create and open the connection in a using block. This
        ' ensures that all resources will be closed and disposed
        ' when the code exits.
        Using connection As New OleDbConnection(connectionString)

            ' Create the Command and Parameter objects.
            Dim command As New OleDbCommand(queryString, connection)
            command.Parameters.AddWithValue("@pricePoint", paramValue)
'---- @pricePoint가 무엇을 의미하는지 모르겠음. 차후에 별도 학습

            ' Open the connection in a try/catch block.
            ' Create and execute the DataReader, writing the result
            ' set to the console window.
            Try
                connection.Open()
                Dim dataReader As OleDbDataReader = _
                 command.ExecuteReader()
                Do While dataReader.Read()
                    Console.WriteLine( _
                        vbTab & "{0}" & vbTab & "{1}" & vbTab & "{2}", _
                     dataReader(0), dataReader(1), dataReader(2))
'----dataReader의 Read()된 값 중에서 순서대로 dataReader(0), dataReader(1), dataReader(2)로 WriteLine 출력한다.
'----dataReader(0) = ProductID, dataReader(1) = UnitPrice , dataReader(2) = ProductName
 
                Loop
                dataReader.Close()

            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try
            Console.ReadLine()
        End Using
    End Sub


'-----여기서부터는 위의 Main 서브루틴을 응용하여 내가 필요로하는 쿼리문을 작성한 것------------
    Public Shared Sub Main2()

        ' The connection string assumes that the Access
        ' Northwind.mdb is located in the c:\Data folder.

        Dim connectionString As String = _
             "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
            & "c:\data\DTC_desc.MDB;User Id=admin;Password=;"

        ' Provide the query string with a parameter placeholder.
        Dim queryString As String = _
            "SELECT ID, DTCname, DTCdesc from DTC_list " _
            & "WHERE DTCname = 'B250000' " _
            & "ORDER BY ID;"
        ' WHERE DTCname = X 에 X에다가 고장코드를 넣으면 조회됨
        ' Specify the parameter value.

        Dim paramValue As Integer = 5

        ' Create and open the connection in a using block. This
        ' ensures that all resources will be closed and disposed
        ' when the code exits.
        Using connection As New OleDbConnection(connectionString)

            ' Create the Command and Parameter objects.
            Dim command As New OleDbCommand(queryString, connection)
            command.Parameters.AddWithValue("@pricePoint", paramValue)

            ' Open the connection in a try/catch block.
            ' Create and execute the DataReader, writing the result
            ' set to the console window.
            Try
                connection.Open()
                Dim dataReader As OleDbDataReader = _
                 command.ExecuteReader()
                Do While dataReader.Read()
                    Console.WriteLine( _
                        vbTab & "{0}" & vbTab & "{1}" & vbTab & "{2}", _
                     dataReader(0), dataReader(1), dataReader(2))
                Loop
                dataReader.Close()

            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try
            Console.ReadLine()
        End Using
    End Sub
End Class


위의 Main() 으로 console 실행하면 아래와 같은 결과가 나온다.

Northwind.zipADONETfromMSDN.zip


[COM] a error case which is GetFunction method in CAPLFunction with a definition in CAPL Vector(CANoe)


COM의 개체 중 CAPLFunction에서 GetFunction 메쏘드를 사용하여 CAPL에 정의된 함수를 불러 올때,

에러없이 실행이 안되는 경우가 있다.

이는 아래와 같은 경우일 수 있으므로 참고로 작성한다.

    Dim WithEvents App As CANalyzer.Application
    Dim WithEvents Measurement As CANalyzer.Measurement
    Dim systemWrite As CANalyzer.Write
    Dim appCAPL As CANalyzer.CAPL
    Dim NewFunction As CANalyzer.CAPLFunction
    Dim NewFunction1 As CANalyzer.CAPLFunction
    Dim fnSendMessage As CANalyzer.CAPLFunction
    Dim fnSendMessage1 As CANalyzer.CAPLFunction 
    Dim fnWriteToLog As CANalyzer.CAPLFunction

 ...
    Public Sub New()
        App = CreateObject("CANalyzer.Application")
        Measurement = App.Measurement
        appCAPL = App.CAPL
        systemWrite = App.UI.write

...
    End Sub
    
    Private Sub Measurement_OnInit() Handles Measurement.OnInit

        NewFunction = appCAPL.GetFunction("NewFunction")
        NewFunction1 = appCAPL.GetFunction("NewFunction1")
        fnSendMessage = appCAPL.GetFunction("fnSendMessage")
        fnSendMessage1 = appCAPL.GetFunction("fnSendMessage1")
        fnWriteToLog = appCAPL.GetFunction("fnWriteToLog")

    End Sub

위와 같이 설정 했는데 CAPL 파일에는 붉은 색으로 표시된 함수가 없을 경우

컴파일 및 캐널라이져에서 dll 파일을 불러오는데는 문제가 없으나

다른 함수들 call하는 것도 실행이 안된다. (아래 그림 참조)



















일종의 COM Server 버그로 생각됨.

아래는 GetFunction 설명


[COM] a case 'Exception has been thrown by the target of an invocation' Error has occured in CANoe Vector(CANoe)


1 2 3 4 5