আরডুইনো স্কেচ থেকে সি ফাংশনগুলি কীভাবে কল করবেন?


10

আমি জানতে চাই যে আরডুইনো স্কেচ ব্যবহার করে সি ফাইলের মধ্যে থাকা ফাংশনগুলিকে কল করার কোনও উপায় আছে কিনা?

আমার সি ফাইল একটি ফাংশন ঘোষণা করে এবং সংজ্ঞায়িত করে। আমার আরডিনো স্কেচে অগোছালো ফাংশন সংজ্ঞাটি সংরক্ষণ করতে, আমি স্কেচ থেকে সরাসরি ফাংশনটি কল করতে চাই।

আরডুইনো এবং সি ব্যবহার করে এটি করার কোনও মানক উপায় নেই? স্কেচটি এখানে:

#include "crc16.h";

void setup(){

}

void loop(){

  CalculateCRC16("<09M", 4);

}

এবং এটি ট্রিমড ডাউন সি ফাইল:

#include <stdio.h>
#include <stdint.h>

uint16_t crctable[256] =
{
    0x0000, 0x1189,.....



uint16_t // Returns Calculated CRC value
CalculateCRC16( // Call example CalculateCRC16("<09M", 4);
    const void *c_ptr, // Pointer to byte array to perform CRC on
    size_t len)        // Number of bytes to CRC
{

    uint16_t crc = 0xFFFF // Seed for CRC calculation
    const uint8_t *c = c_ptr;

    while (len--)
        crc = (crc << 8) ^ crctable[((crc >> 8) ^ *c++)];

    return crc;
}

আপনার ফাইলটিতে সি ++ এর পরিবর্তে সি ব্যবহার করার কোনও কারণ আছে?
পিটার ব্লুমফিল্ড

সত্যি বলতে হ্যা. আমি যখন সি ++ ব্যবহার করে ফাইলটি সংকলন করার চেষ্টা করি তখন ত্রুটিগুলি থাকে তবে এটি সি তে ত্রুটিমুক্ত থাকে লাইনগুলির দ্বারা: const void *c_ptrএবং const uint8_t *c = c_ptr;। ত্রুটি বার্তা প্রকারের মধ্যে একটি অবৈধ রূপান্তর উল্লেখ করে।
USER_NAME

4
আপনি কি দয়া করে 2 টি কোড ফাইল (বা সেগুলির একটি সরল ন্যূনতম সংস্করণ) পোস্ট করতে পারেন যা ত্রুটি তৈরি করে এবং ত্রুটি বার্তাকে অনুলিপি এবং অনুলিপি করে পেস্ট করতে পারে?
ড্রোড্রি 27'14

ত্রুটি বার্তা খুব সুন্দর নয়: In function uint16_t CalculateCRC16(uint16_t, const void*, size_t)': 46 invalid conversion from থেকে const অকার্যকর * 'const uint8_t*' In function int main()': 57 system' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.)
USER_NAME

উত্তর:


10

আপনি নীচের মত "সি" # অন্তর্ভুক্ত করতে পারেন:

extern "C"{
#include "crc16.h"
};

void setup(){
}

void loop(){
  CalculateCRC16("<09M", 4);
}

এবং crc16.h ফাইলটি হতে পারে (কিছু ছোট ছোট ফিক্স, একবার # প্রাগমা একবার, একটি কাস্ট):

#pragma once

#include <stdio.h>
#include <stdint.h>

uint16_t crctable[2] ={ 0x0000, 0x1189};

uint16_t CalculateCRC16( // Call example CalculateCRC16("<09M", 4);
    const void *c_ptr, // Pointer to byte array to perform CRC on
    size_t len)        // Number of bytes to CRC
{
    uint16_t crc = 0xFFFF; // Seed for CRC calculation
    const uint8_t *c = (const uint8_t *)c_ptr;

    while (len--)
        crc = (crc << 8) ^ crctable[((crc >> 8) ^ *c++)];

    return crc;
}

ধন্যবাদ, এটি এখন ঠিক কাজ করে। আপনি দয়া করে প্রগমা প্রয়োজন ব্যাখ্যা করতে পারেন?
USER_NAME

1
অবশ্যই, এটি একটি ভাল অনুশীলন, যদিও এটি আপনার উদাহরণে প্রয়োজন হয় না। এটি একই শিরোলেখ ফাইলটি একটি সংকলন ফাইলের মধ্যে দুবার অন্তর্ভুক্ত করা এড়িয়ে চলে। A.cpp -> (bh এবং ch) এবং bh-> ch এর কল্পনা করুন যা a.cpp সংকলনের সময় ch এর বিষয়বস্তুগুলিকে নকল করবে। # প্রগমা এটি একবার এড়িয়ে চলে। এছাড়াও প্রহরী নির্দেশিকা # আইফোনডেফ _এমওয়াইফাইল_এনপিএল_ডিকুইন _মাই_ফাইলে_এনপিএলড এই জন্য সাধারণ। তবে দ্রষ্টব্য, পিটার আর ব্লুমফিল্ডটি যেমন উল্লেখ করেছে, ক্যালকুলেট সিআরসি 16 এর প্রয়োগটি সিপিপি ফাইলে রেখে দেওয়া ভাল এবং কেবলমাত্র শিরোনাম ফাইলটিতে ঘোষণা রেখে দেওয়া ভাল।
ড্রোড্রি

ঠিক আছে, আমি দেখতে পাচ্ছি যে কোডটি যখন আরও বেশি জটিল হয়। পরামর্শের জন্য ধন্যবাদ.
USER_NAME

4

আপনার সিআরসি ফাংশনটি সহজেই সি ++ তে রূপান্তরিত হতে পারে যাতে এটি একটি * .cpp ফাইলে যেতে পারে। আপনি যখন আপনার cপয়েন্টারটি আরম্ভ করবেন তখন আপনাকে কেবল একটি স্পষ্ট কাস্ট ব্যবহার করতে হবে । এটি করার জন্য এখানে 'যথাযথ' সি ++ উপায় রয়েছে:

const uint8_t *c = static_cast<const uint8_t*>(c_ptr);

তবে, একটি পুরানো সি স্টাইলের কাস্ট কাজ করবে:

const uint8_t *c = (const uint8_t*)c_ptr;

সমস্যাটি মূলত: সি আপনাকে প্রকারের মধ্যে সুস্পষ্টভাবে পয়েন্টারগুলিতে রূপান্তর করতে দেওয়া সম্পর্কে আরও কিছুটা অনুমতিযুক্ত হতে পারে। এটি সি ++ এ করার জন্য আপনাকে সংকলককে স্পষ্ট করে বলতে হবে যে রূপান্তরটি ইচ্ছাকৃত।


1

হ্যাঁ, কেবল এটির ঘোষণার রেখাটি আপনার স্কেচে অনুলিপি করুন:

extern "C" {
    void myfunction(int arg);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.